blob: 8dcb4131e302d541726a43729c12368db2be0324 [file] [log] [blame]
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -06001#include <array>
2
3#include "libpldm/pdr.h"
4#include "libpldm/platform.h"
5
6#include <gtest/gtest.h>
7
8TEST(PDRAccess, testInit)
9{
10 auto repo = pldm_pdr_init();
crgeddes2550cee2020-05-05 17:51:28 +000011 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
12 EXPECT_EQ(pldm_pdr_get_repo_size(repo), 0u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060013 pldm_pdr_destroy(repo);
14}
15
16TEST(PDRUpdate, testAdd)
17{
18 auto repo = pldm_pdr_init();
19
20 std::array<uint8_t, 10> data{};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -050021 auto handle = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
crgeddes2550cee2020-05-05 17:51:28 +000022 EXPECT_EQ(handle, 1u);
23 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060024 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size());
25
crgeddes2550cee2020-05-05 17:51:28 +000026 handle = pldm_pdr_add(repo, data.data(), data.size(), 0u, false);
27 EXPECT_EQ(handle, 2u);
28 handle = pldm_pdr_add(repo, data.data(), data.size(), 0u, false);
29 EXPECT_EQ(handle, 3u);
30 handle = pldm_pdr_add(repo, data.data(), data.size(), htole32(0xdeeddeedu),
Deepak Kodihalli87514cc2020-04-16 09:08:38 -050031 false);
Lei YU90ff3ed2020-03-02 11:16:51 +080032 EXPECT_EQ(handle, htole32(0xdeeddeed));
crgeddes2550cee2020-05-05 17:51:28 +000033 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
34 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size() * 4u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060035
36 pldm_pdr_destroy(repo);
37}
38
Deepak Kodihalli4a680932020-04-22 03:31:17 -050039TEST(PDRUpdate, testRemove)
40{
41 std::array<uint8_t, 10> data{};
42
43 auto repo = pldm_pdr_init();
44 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +000045 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -050046 pldm_pdr_destroy(repo);
47
48 repo = pldm_pdr_init();
49 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
50 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +000051 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -050052 pldm_pdr_destroy(repo);
53
54 repo = pldm_pdr_init();
55 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
56 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +000057 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -050058 pldm_pdr_destroy(repo);
59
60 repo = pldm_pdr_init();
61 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
62 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
63 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +000064 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -050065 pldm_pdr_destroy(repo);
66
67 repo = pldm_pdr_init();
68 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
69 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
70 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +000071 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -050072 pldm_pdr_destroy(repo);
73
74 repo = pldm_pdr_init();
75 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
76 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
77 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
78 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
79 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +000080 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -050081 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
82 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
crgeddes2550cee2020-05-05 17:51:28 +000083 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -050084 pldm_pdr_destroy(repo);
85
86 repo = pldm_pdr_init();
87 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
88 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
89 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
90 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
91 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +000092 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -050093 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
94 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
crgeddes2550cee2020-05-05 17:51:28 +000095 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -050096 pldm_pdr_destroy(repo);
97
98 repo = pldm_pdr_init();
99 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
100 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
101 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
102 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
103 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +0000104 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500105 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
106 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
crgeddes2550cee2020-05-05 17:51:28 +0000107 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500108 pldm_pdr_destroy(repo);
109
110 repo = pldm_pdr_init();
111 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
112 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
113 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
114 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
115 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +0000116 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500117 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
118 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
crgeddes2550cee2020-05-05 17:51:28 +0000119 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500120 pldm_pdr_destroy(repo);
121
122 repo = pldm_pdr_init();
123 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
124 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
125 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
126 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
127 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +0000128 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500129 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
130 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
crgeddes2550cee2020-05-05 17:51:28 +0000131 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500132 pldm_pdr_destroy(repo);
133
134 repo = pldm_pdr_init();
135 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
136 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
137 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
138 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
139 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +0000140 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500141 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
142 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
crgeddes2550cee2020-05-05 17:51:28 +0000143 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500144 pldm_pdr_destroy(repo);
145
146 repo = pldm_pdr_init();
147 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
148 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
149 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
150 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
151 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +0000152 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500153 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
154 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
crgeddes2550cee2020-05-05 17:51:28 +0000155 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500156 pldm_pdr_destroy(repo);
157
158 repo = pldm_pdr_init();
159 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
160 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
161 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
162 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
163 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +0000164 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500165 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
166 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
crgeddes2550cee2020-05-05 17:51:28 +0000167 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500168 pldm_pdr_destroy(repo);
169
170 repo = pldm_pdr_init();
171 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
172 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
173 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
174 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
175 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +0000176 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500177 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
178 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
crgeddes2550cee2020-05-05 17:51:28 +0000179 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500180 pldm_pdr_destroy(repo);
181
182 repo = pldm_pdr_init();
183 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
184 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
185 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
186 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
187 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +0000188 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500189 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
190 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
crgeddes2550cee2020-05-05 17:51:28 +0000191 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500192 pldm_pdr_destroy(repo);
193
194 repo = pldm_pdr_init();
195 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
196 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
197 pldm_pdr_add(repo, data.data(), data.size(), 0, false);
198 pldm_pdr_add(repo, data.data(), data.size(), 0, true);
199 pldm_pdr_remove_remote_pdrs(repo);
crgeddes2550cee2020-05-05 17:51:28 +0000200 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500201 auto handle = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
crgeddes2550cee2020-05-05 17:51:28 +0000202 EXPECT_EQ(handle, 3u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500203 handle = pldm_pdr_add(repo, data.data(), data.size(), 0, true);
crgeddes2550cee2020-05-05 17:51:28 +0000204 EXPECT_EQ(handle, 4u);
205 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Deepak Kodihalli4a680932020-04-22 03:31:17 -0500206 pldm_pdr_destroy(repo);
207}
208
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600209TEST(PDRAccess, testGet)
210{
211 auto repo = pldm_pdr_init();
212
213 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500214 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()), sizeof(in), 1,
215 false);
crgeddes2550cee2020-05-05 17:51:28 +0000216 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600217 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
218 uint32_t size{};
219 uint32_t nextRecHdl{};
220 uint8_t* outData = nullptr;
221 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
222 EXPECT_NE(hdl, nullptr);
223 EXPECT_EQ(size, sizeof(in));
crgeddes2550cee2020-05-05 17:51:28 +0000224 EXPECT_EQ(nextRecHdl, 0u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600225 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
226 outData = nullptr;
227
228 auto hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
229 EXPECT_EQ(hdl, hdl2);
230 EXPECT_NE(hdl, nullptr);
231 EXPECT_EQ(size, sizeof(in));
crgeddes2550cee2020-05-05 17:51:28 +0000232 EXPECT_EQ(nextRecHdl, 0u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600233 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
234 outData = nullptr;
235
Lei YU7cfeb8e2020-02-27 18:24:18 +0800236 hdl = pldm_pdr_find_record(repo, htole32(0xdeaddead), &outData, &size,
237 &nextRecHdl);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600238 EXPECT_EQ(hdl, nullptr);
crgeddes2550cee2020-05-05 17:51:28 +0000239 EXPECT_EQ(size, 0u);
240 EXPECT_EQ(nextRecHdl, 0u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600241 EXPECT_EQ(outData, nullptr);
242 outData = nullptr;
243
244 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
245 0, 110, 450, 234034, 123123};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500246 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 2,
247 false);
248 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 3,
249 false);
250 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 4,
251 true);
crgeddes2550cee2020-05-05 17:51:28 +0000252 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600253 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
254 hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
255 EXPECT_NE(hdl, nullptr);
256 EXPECT_EQ(size, sizeof(in));
crgeddes2550cee2020-05-05 17:51:28 +0000257 EXPECT_EQ(nextRecHdl, 2u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600258 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
259 outData = nullptr;
260 hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
261 EXPECT_EQ(hdl, hdl2);
262 EXPECT_NE(hdl, nullptr);
263 EXPECT_EQ(size, sizeof(in));
crgeddes2550cee2020-05-05 17:51:28 +0000264 EXPECT_EQ(nextRecHdl, 2u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600265 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
266 outData = nullptr;
267 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
268 EXPECT_NE(hdl, nullptr);
269 EXPECT_EQ(size, sizeof(in2));
crgeddes2550cee2020-05-05 17:51:28 +0000270 EXPECT_EQ(nextRecHdl, 3u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600271 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
272 outData = nullptr;
273 hdl = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
274 EXPECT_NE(hdl, nullptr);
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500275 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600276 EXPECT_EQ(size, sizeof(in2));
crgeddes2550cee2020-05-05 17:51:28 +0000277 EXPECT_EQ(nextRecHdl, 4u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600278 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
279 outData = nullptr;
280 hdl = pldm_pdr_find_record(repo, 4, &outData, &size, &nextRecHdl);
281 EXPECT_NE(hdl, nullptr);
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500282 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), true);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600283 EXPECT_EQ(size, sizeof(in2));
crgeddes2550cee2020-05-05 17:51:28 +0000284 EXPECT_EQ(nextRecHdl, 0u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600285 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
286 outData = nullptr;
287
288 pldm_pdr_destroy(repo);
289}
290
291TEST(PDRAccess, testGetNext)
292{
293 auto repo = pldm_pdr_init();
294
295 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500296 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()), sizeof(in), 1,
297 false);
crgeddes2550cee2020-05-05 17:51:28 +0000298 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600299 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
300 uint32_t size{};
301 uint32_t nextRecHdl{};
302 uint8_t* outData = nullptr;
303 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
304 EXPECT_NE(hdl, nullptr);
305 EXPECT_EQ(size, sizeof(in));
crgeddes2550cee2020-05-05 17:51:28 +0000306 EXPECT_EQ(nextRecHdl, 0u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600307 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
308 outData = nullptr;
309
310 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
311 0, 110, 450, 234034, 123123};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500312 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 2,
313 false);
314 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 3,
315 false);
316 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 4,
317 false);
crgeddes2550cee2020-05-05 17:51:28 +0000318 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600319 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
320 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
321 EXPECT_NE(hdl, nullptr);
322 EXPECT_EQ(size, sizeof(in2));
crgeddes2550cee2020-05-05 17:51:28 +0000323 EXPECT_EQ(nextRecHdl, 3u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600324 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
325 outData = nullptr;
326 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
327 EXPECT_NE(hdl, nullptr);
328 EXPECT_EQ(size, sizeof(in2));
crgeddes2550cee2020-05-05 17:51:28 +0000329 EXPECT_EQ(nextRecHdl, 4u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600330 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
331 outData = nullptr;
332 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
333 EXPECT_NE(hdl, nullptr);
334 EXPECT_EQ(size, sizeof(in2));
crgeddes2550cee2020-05-05 17:51:28 +0000335 EXPECT_EQ(nextRecHdl, 0u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600336 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
337 outData = nullptr;
338
339 pldm_pdr_destroy(repo);
340}
341
342TEST(PDRAccess, testFindByType)
343{
344 auto repo = pldm_pdr_init();
345
346 std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
347 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(data.data());
348 hdr->type = 1;
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500349 auto first = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600350 hdr->type = 2;
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500351 auto second = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600352 hdr->type = 3;
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500353 auto third = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600354 hdr->type = 4;
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500355 auto fourth = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600356
357 uint8_t* outData = nullptr;
358 uint32_t size{};
359 auto firstRec =
360 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
361 EXPECT_EQ(pldm_pdr_get_record_handle(repo, firstRec), first);
362 outData = nullptr;
363 auto secondRec =
364 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
365 EXPECT_EQ(pldm_pdr_get_record_handle(repo, secondRec), second);
366 outData = nullptr;
367 auto thirdRec =
368 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
369 EXPECT_EQ(pldm_pdr_get_record_handle(repo, thirdRec), third);
370 outData = nullptr;
371 auto fourthRec =
372 pldm_pdr_find_record_by_type(repo, 4, nullptr, &outData, &size);
373 EXPECT_EQ(pldm_pdr_get_record_handle(repo, fourthRec), fourth);
374 outData = nullptr;
375 auto fifthRec =
376 pldm_pdr_find_record_by_type(repo, 5, nullptr, &outData, &size);
377 EXPECT_EQ(fifthRec, nullptr);
378 EXPECT_EQ(outData, nullptr);
crgeddes2550cee2020-05-05 17:51:28 +0000379 EXPECT_EQ(size, 0u);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600380
381 auto rec =
382 pldm_pdr_find_record_by_type(repo, 3, secondRec, &outData, &size);
383 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), third);
384 outData = nullptr;
385 rec = pldm_pdr_find_record_by_type(repo, 4, secondRec, &outData, &size);
386 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), fourth);
387 outData = nullptr;
388 rec = pldm_pdr_find_record_by_type(repo, 2, firstRec, &outData, &size);
389 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), second);
390 outData = nullptr;
391
392 pldm_pdr_destroy(repo);
393}
Deepak Kodihallidb914672020-02-07 02:47:45 -0600394
395TEST(PDRUpdate, testAddFruRecordSet)
396{
397 auto repo = pldm_pdr_init();
398
399 auto handle = pldm_pdr_add_fru_record_set(repo, 1, 10, 1, 0, 100);
crgeddes2550cee2020-05-05 17:51:28 +0000400 EXPECT_EQ(handle, 1u);
401 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Deepak Kodihallidb914672020-02-07 02:47:45 -0600402 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
403 sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
404 uint32_t size{};
405 uint32_t nextRecHdl{};
406 uint8_t* outData = nullptr;
407 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
408 EXPECT_NE(hdl, nullptr);
409 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
crgeddes2550cee2020-05-05 17:51:28 +0000410 EXPECT_EQ(nextRecHdl, 0u);
Deepak Kodihallidb914672020-02-07 02:47:45 -0600411 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
crgeddes2550cee2020-05-05 17:51:28 +0000412 EXPECT_EQ(hdr->version, 1u);
Deepak Kodihallidb914672020-02-07 02:47:45 -0600413 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500414 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
415 EXPECT_EQ(hdr->record_handle, htole32(1));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600416 pldm_pdr_fru_record_set* fru = reinterpret_cast<pldm_pdr_fru_record_set*>(
417 outData + sizeof(pldm_pdr_hdr));
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500418 EXPECT_EQ(fru->terminus_handle, htole16(1));
419 EXPECT_EQ(fru->fru_rsi, htole16(10));
420 EXPECT_EQ(fru->entity_type, htole16(1));
421 EXPECT_EQ(fru->entity_instance_num, htole16(0));
422 EXPECT_EQ(fru->container_id, htole16(100));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600423 outData = nullptr;
424
425 handle = pldm_pdr_add_fru_record_set(repo, 2, 11, 2, 1, 101);
crgeddes2550cee2020-05-05 17:51:28 +0000426 EXPECT_EQ(handle, 2u);
427 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Deepak Kodihallidb914672020-02-07 02:47:45 -0600428 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
429 2 * (sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set)));
430 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
431 EXPECT_NE(hdl, nullptr);
432 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
crgeddes2550cee2020-05-05 17:51:28 +0000433 EXPECT_EQ(nextRecHdl, 0u);
Deepak Kodihallidb914672020-02-07 02:47:45 -0600434 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
crgeddes2550cee2020-05-05 17:51:28 +0000435 EXPECT_EQ(hdr->version, 1u);
Deepak Kodihallidb914672020-02-07 02:47:45 -0600436 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500437 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
438 EXPECT_EQ(hdr->record_handle, htole32(2));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600439 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
440 sizeof(pldm_pdr_hdr));
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500441 EXPECT_EQ(fru->terminus_handle, htole16(2));
442 EXPECT_EQ(fru->fru_rsi, htole16(11));
443 EXPECT_EQ(fru->entity_type, htole16(2));
444 EXPECT_EQ(fru->entity_instance_num, htole16(1));
445 EXPECT_EQ(fru->container_id, htole16(101));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600446 outData = nullptr;
447
448 hdl = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
449 EXPECT_NE(hdl, nullptr);
450 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
crgeddes2550cee2020-05-05 17:51:28 +0000451 EXPECT_EQ(nextRecHdl, 2u);
Deepak Kodihallidb914672020-02-07 02:47:45 -0600452 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
crgeddes2550cee2020-05-05 17:51:28 +0000453 EXPECT_EQ(hdr->version, 1u);
Deepak Kodihallidb914672020-02-07 02:47:45 -0600454 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500455 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
456 EXPECT_EQ(hdr->record_handle, htole32(1));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600457 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
458 sizeof(pldm_pdr_hdr));
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500459 EXPECT_EQ(fru->terminus_handle, htole16(1));
460 EXPECT_EQ(fru->fru_rsi, htole16(10));
461 EXPECT_EQ(fru->entity_type, htole16(1));
462 EXPECT_EQ(fru->entity_instance_num, htole16(0));
463 EXPECT_EQ(fru->container_id, htole16(100));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600464 outData = nullptr;
465
466 pldm_pdr_destroy(repo);
467}
468
469TEST(PDRUpdate, tesFindtFruRecordSet)
470{
471 auto repo = pldm_pdr_init();
472
473 uint16_t terminusHdl{};
474 uint16_t entityType{};
475 uint16_t entityInstanceNum{};
476 uint16_t containerId{};
477 auto first = pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100);
478 auto second = pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100);
479 auto third = pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100);
480 EXPECT_EQ(first, pldm_pdr_get_record_handle(
481 repo, pldm_pdr_fru_record_set_find_by_rsi(
482 repo, 1, &terminusHdl, &entityType,
483 &entityInstanceNum, &containerId)));
484 EXPECT_EQ(second, pldm_pdr_get_record_handle(
485 repo, pldm_pdr_fru_record_set_find_by_rsi(
486 repo, 2, &terminusHdl, &entityType,
487 &entityInstanceNum, &containerId)));
488 EXPECT_EQ(third, pldm_pdr_get_record_handle(
489 repo, pldm_pdr_fru_record_set_find_by_rsi(
490 repo, 3, &terminusHdl, &entityType,
491 &entityInstanceNum, &containerId)));
crgeddes2550cee2020-05-05 17:51:28 +0000492 EXPECT_EQ(terminusHdl, 1u);
493 EXPECT_EQ(entityType, 1u);
494 EXPECT_EQ(entityInstanceNum, 2u);
495 EXPECT_EQ(containerId, 100u);
Deepak Kodihallidb914672020-02-07 02:47:45 -0600496 EXPECT_EQ(nullptr, pldm_pdr_fru_record_set_find_by_rsi(
497 repo, 4, &terminusHdl, &entityType,
498 &entityInstanceNum, &containerId));
499
500 pldm_pdr_destroy(repo);
501}
Deepak Kodihalli05787052020-03-10 01:54:08 -0500502
503TEST(EntityAssociationPDR, testInit)
504{
505 auto tree = pldm_entity_association_tree_init();
506 EXPECT_NE(tree, nullptr);
507 pldm_entity_association_tree_destroy(tree);
508}
509
510TEST(EntityAssociationPDR, testBuild)
511{
512 // 1
513 // |
514 // 2--3--4
515 // |
516 // 5--6--7
517 // | |
518 // 9 8
519
520 pldm_entity entities[9]{};
521
522 entities[0].entity_type = 1;
523 entities[1].entity_type = 2;
524 entities[2].entity_type = 2;
525 entities[3].entity_type = 3;
526 entities[4].entity_type = 4;
527 entities[5].entity_type = 5;
528 entities[6].entity_type = 5;
529 entities[7].entity_type = 6;
530 entities[8].entity_type = 7;
531
532 auto tree = pldm_entity_association_tree_init();
533
534 auto l1 = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
535 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
536 EXPECT_NE(l1, nullptr);
537 auto l2a = pldm_entity_association_tree_add(
538 tree, &entities[1], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
539 EXPECT_NE(l2a, nullptr);
540 auto l2b = pldm_entity_association_tree_add(
541 tree, &entities[2], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
542 EXPECT_NE(l2b, nullptr);
543 auto l2c = pldm_entity_association_tree_add(
544 tree, &entities[3], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
545 EXPECT_NE(l2c, nullptr);
546 auto l3a = pldm_entity_association_tree_add(
547 tree, &entities[4], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
548 EXPECT_NE(l3a, nullptr);
549 auto l3b = pldm_entity_association_tree_add(
550 tree, &entities[5], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
551 EXPECT_NE(l3b, nullptr);
552 auto l3c = pldm_entity_association_tree_add(
553 tree, &entities[6], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
554 EXPECT_NE(l3b, nullptr);
555 auto l4a = pldm_entity_association_tree_add(
556 tree, &entities[7], l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
557 EXPECT_NE(l4a, nullptr);
558 auto l4b = pldm_entity_association_tree_add(
559 tree, &entities[8], l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
560 EXPECT_NE(l4b, nullptr);
561
562 EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
563 EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
564 EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
565 EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
566
567 EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
568 EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
569 EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
570 EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
571 EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
572
George Liufe77eea2021-04-28 15:08:07 +0800573 EXPECT_EQ(pldm_entity_get_parent(l1), nullptr);
574
575 EXPECT_EQ(pldm_entity_get_parent(l2a), l1);
576 EXPECT_EQ(pldm_entity_get_parent(l2b), l1);
577 EXPECT_EQ(pldm_entity_get_parent(l2c), l1);
578
579 EXPECT_EQ(pldm_entity_get_parent(l3a), l2a);
580 EXPECT_EQ(pldm_entity_get_parent(l3b), l2a);
581 EXPECT_EQ(pldm_entity_get_parent(l3c), l2a);
582
583 EXPECT_EQ(pldm_entity_get_parent(l4a), l3a);
584
585 EXPECT_EQ(pldm_entity_get_parent(l4b), l3b);
586
Deepak Kodihalli05787052020-03-10 01:54:08 -0500587 size_t num{};
588 pldm_entity* out = nullptr;
589 pldm_entity_association_tree_visit(tree, &out, &num);
crgeddes2550cee2020-05-05 17:51:28 +0000590 EXPECT_EQ(num, 9u);
Deepak Kodihalli05787052020-03-10 01:54:08 -0500591
crgeddes2550cee2020-05-05 17:51:28 +0000592 EXPECT_EQ(out[0].entity_type, 1u);
593 EXPECT_EQ(out[0].entity_instance_num, 1u);
594 EXPECT_EQ(out[0].entity_container_id, 0u);
Deepak Kodihalli05787052020-03-10 01:54:08 -0500595
crgeddes2550cee2020-05-05 17:51:28 +0000596 EXPECT_EQ(out[1].entity_type, 2u);
597 EXPECT_EQ(out[1].entity_instance_num, 1u);
598 EXPECT_EQ(out[1].entity_container_id, 1u);
599 EXPECT_EQ(out[2].entity_type, 2u);
600 EXPECT_EQ(out[2].entity_instance_num, 2u);
601 EXPECT_EQ(out[2].entity_container_id, 1u);
602 EXPECT_EQ(out[3].entity_type, 3u);
603 EXPECT_EQ(out[3].entity_instance_num, 1u);
604 EXPECT_EQ(out[3].entity_container_id, 1u);
Deepak Kodihalli05787052020-03-10 01:54:08 -0500605
crgeddes2550cee2020-05-05 17:51:28 +0000606 EXPECT_EQ(out[4].entity_type, 4u);
607 EXPECT_EQ(out[4].entity_instance_num, 1u);
608 EXPECT_EQ(out[4].entity_container_id, 2u);
609 EXPECT_EQ(out[5].entity_type, 5u);
610 EXPECT_EQ(out[5].entity_instance_num, 1u);
611 EXPECT_EQ(out[5].entity_container_id, 2u);
612 EXPECT_EQ(out[6].entity_type, 5u);
613 EXPECT_EQ(out[6].entity_instance_num, 2u);
614 EXPECT_EQ(out[6].entity_container_id, 2u);
Deepak Kodihalli05787052020-03-10 01:54:08 -0500615
crgeddes2550cee2020-05-05 17:51:28 +0000616 EXPECT_EQ(out[7].entity_type, 7u);
617 EXPECT_EQ(out[7].entity_instance_num, 1u);
618 EXPECT_EQ(out[7].entity_container_id, 4u);
619 EXPECT_EQ(out[8].entity_type, 6u);
620 EXPECT_EQ(out[8].entity_instance_num, 1u);
621 EXPECT_EQ(out[8].entity_container_id, 3u);
Deepak Kodihalli05787052020-03-10 01:54:08 -0500622
623 free(out);
George Liud9855ab2021-05-13 09:41:31 +0800624
625 pldm_entity p1 = pldm_entity_extract(l1);
626 EXPECT_EQ(p1.entity_type, 1u);
627 EXPECT_EQ(p1.entity_instance_num, 1u);
628 EXPECT_EQ(p1.entity_container_id, 0u);
629
630 pldm_entity p2a = pldm_entity_extract(l2a);
631 EXPECT_EQ(p2a.entity_type, 2u);
632 EXPECT_EQ(p2a.entity_instance_num, 1u);
633 EXPECT_EQ(p2a.entity_container_id, 1u);
634 pldm_entity p2b = pldm_entity_extract(l2b);
635 EXPECT_EQ(p2b.entity_type, 2u);
636 EXPECT_EQ(p2b.entity_instance_num, 2u);
637 EXPECT_EQ(p2b.entity_container_id, 1u);
638 pldm_entity p2c = pldm_entity_extract(l2c);
639 EXPECT_EQ(p2c.entity_type, 3u);
640 EXPECT_EQ(p2c.entity_instance_num, 1u);
641 EXPECT_EQ(p2c.entity_container_id, 1u);
642
643 pldm_entity p3a = pldm_entity_extract(l3a);
644 EXPECT_EQ(p3a.entity_type, 4u);
645 EXPECT_EQ(p3a.entity_instance_num, 1u);
646 EXPECT_EQ(p3a.entity_container_id, 2u);
647 pldm_entity p3b = pldm_entity_extract(l3b);
648 EXPECT_EQ(p3b.entity_type, 5u);
649 EXPECT_EQ(p3b.entity_instance_num, 1u);
650 EXPECT_EQ(p3b.entity_container_id, 2u);
651 pldm_entity p3c = pldm_entity_extract(l3c);
652 EXPECT_EQ(p3c.entity_type, 5u);
653 EXPECT_EQ(p3c.entity_instance_num, 2u);
654 EXPECT_EQ(p3c.entity_container_id, 2u);
655
656 pldm_entity p4a = pldm_entity_extract(l4a);
657 EXPECT_EQ(p4a.entity_type, 6u);
658 EXPECT_EQ(p4a.entity_instance_num, 1u);
659 EXPECT_EQ(p4a.entity_container_id, 3u);
660 pldm_entity p4b = pldm_entity_extract(l4b);
661 EXPECT_EQ(p4b.entity_type, 7u);
662 EXPECT_EQ(p4b.entity_instance_num, 1u);
663 EXPECT_EQ(p4b.entity_container_id, 4u);
664
Deepak Kodihalli05787052020-03-10 01:54:08 -0500665 pldm_entity_association_tree_destroy(tree);
666}
667
668TEST(EntityAssociationPDR, testSpecialTrees)
669{
670 pldm_entity entities[3]{};
671
672 entities[0].entity_type = 1;
673 entities[1].entity_type = 2;
674 entities[2].entity_type = 1;
675
676 // A
677 auto tree = pldm_entity_association_tree_init();
678 auto node = pldm_entity_association_tree_add(
679 tree, &entities[0], nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
680 EXPECT_NE(node, nullptr);
681 size_t num{};
682 pldm_entity* out = nullptr;
683 pldm_entity_association_tree_visit(tree, &out, &num);
crgeddes2550cee2020-05-05 17:51:28 +0000684 EXPECT_EQ(num, 1u);
685 EXPECT_EQ(out[0].entity_type, 1u);
686 EXPECT_EQ(out[0].entity_instance_num, 1u);
687 EXPECT_EQ(out[0].entity_container_id, 0u);
Deepak Kodihalli05787052020-03-10 01:54:08 -0500688 free(out);
689 pldm_entity_association_tree_destroy(tree);
690
691 // A-A-A
692 tree = pldm_entity_association_tree_init();
693 node = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
694 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
695 EXPECT_NE(node, nullptr);
696 node = pldm_entity_association_tree_add(tree, &entities[1], nullptr,
697 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
698 EXPECT_NE(node, nullptr);
699 node = pldm_entity_association_tree_add(tree, &entities[2], nullptr,
700 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
701 EXPECT_NE(node, nullptr);
702 pldm_entity_association_tree_visit(tree, &out, &num);
crgeddes2550cee2020-05-05 17:51:28 +0000703 EXPECT_EQ(num, 3u);
704 EXPECT_EQ(out[0].entity_type, 1u);
705 EXPECT_EQ(out[0].entity_instance_num, 1u);
706 EXPECT_EQ(out[0].entity_container_id, 0u);
707 EXPECT_EQ(out[1].entity_type, 1u);
708 EXPECT_EQ(out[1].entity_instance_num, 2u);
709 EXPECT_EQ(out[1].entity_container_id, 0u);
710 EXPECT_EQ(out[2].entity_type, 2u);
711 EXPECT_EQ(out[2].entity_instance_num, 1u);
712 EXPECT_EQ(out[2].entity_container_id, 0u);
Deepak Kodihalli05787052020-03-10 01:54:08 -0500713 free(out);
714 pldm_entity_association_tree_destroy(tree);
715
716 // A
717 // |
718 // A
719 // |
720 // A
721 tree = pldm_entity_association_tree_init();
722 node = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
723 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
724 EXPECT_NE(node, nullptr);
725 auto node1 = pldm_entity_association_tree_add(
726 tree, &entities[1], node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
727 EXPECT_NE(node1, nullptr);
728 auto node2 = pldm_entity_association_tree_add(
729 tree, &entities[2], node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
730 EXPECT_NE(node2, nullptr);
731 pldm_entity_association_tree_visit(tree, &out, &num);
crgeddes2550cee2020-05-05 17:51:28 +0000732 EXPECT_EQ(num, 3u);
733 EXPECT_EQ(out[0].entity_type, 1u);
734 EXPECT_EQ(out[0].entity_instance_num, 1u);
735 EXPECT_EQ(out[0].entity_container_id, 0u);
736 EXPECT_EQ(out[1].entity_type, 2u);
737 EXPECT_EQ(out[1].entity_instance_num, 1u);
738 EXPECT_EQ(out[1].entity_container_id, 1u);
739 EXPECT_EQ(out[2].entity_type, 1u);
740 EXPECT_EQ(out[2].entity_instance_num, 1u);
741 EXPECT_EQ(out[2].entity_container_id, 2u);
Deepak Kodihalli05787052020-03-10 01:54:08 -0500742 free(out);
743 pldm_entity_association_tree_destroy(tree);
744
745 // A-A
746 // |
747 // A-A
748 tree = pldm_entity_association_tree_init();
749 node = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
750 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
751 EXPECT_NE(node, nullptr);
752 node = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
753 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
754 EXPECT_NE(node, nullptr);
755 node1 = pldm_entity_association_tree_add(tree, &entities[1], node,
756 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
757 EXPECT_NE(node1, nullptr);
758 node2 = pldm_entity_association_tree_add(tree, &entities[2], node,
759 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
760 EXPECT_NE(node2, nullptr);
761 pldm_entity_association_tree_visit(tree, &out, &num);
crgeddes2550cee2020-05-05 17:51:28 +0000762 EXPECT_EQ(num, 4u);
763 EXPECT_EQ(out[0].entity_type, 1u);
764 EXPECT_EQ(out[0].entity_instance_num, 1u);
765 EXPECT_EQ(out[0].entity_container_id, 0u);
766 EXPECT_EQ(out[1].entity_type, 1u);
767 EXPECT_EQ(out[1].entity_instance_num, 2u);
768 EXPECT_EQ(out[1].entity_container_id, 0u);
769 EXPECT_EQ(out[2].entity_type, 2u);
770 EXPECT_EQ(out[2].entity_instance_num, 1u);
771 EXPECT_EQ(out[2].entity_container_id, 1u);
772 EXPECT_EQ(out[3].entity_type, 1u);
773 EXPECT_EQ(out[3].entity_instance_num, 1u);
774 EXPECT_EQ(out[3].entity_container_id, 1u);
Deepak Kodihalli05787052020-03-10 01:54:08 -0500775 free(out);
776 pldm_entity_association_tree_destroy(tree);
777}
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500778
779TEST(EntityAssociationPDR, testPDR)
780{
781 // e = entity type, c = container id, i = instance num
782
783 // INPUT
784 // 1(e=1)--1a(e=2)
785 // |
786 // 2(e=2)--3(e=2)--4(e=2)--5(e=3)
787 // |
788 // 6(e=4)--7(e=5)--8(e=5)--9(e=5)
789 // | |
790 // 11(e=6) 10(e=7)
791
792 // Expected OUTPUT
793 // 1(e=1,c=0,i=1)
794 // |
795 // 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)
796 // |
797 // 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)
798 // | |
799 // 10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
800 pldm_entity entities[11]{};
801
802 entities[0].entity_type = 1;
803 entities[1].entity_type = 2;
804 entities[2].entity_type = 3;
805 entities[3].entity_type = 2;
806 entities[4].entity_type = 3;
807 entities[5].entity_type = 4;
808 entities[6].entity_type = 5;
809 entities[7].entity_type = 5;
810 entities[8].entity_type = 5;
811 entities[9].entity_type = 6;
812 entities[10].entity_type = 7;
813
814 auto tree = pldm_entity_association_tree_init();
815
816 auto l1 = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
817 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
818 EXPECT_NE(l1, nullptr);
819 auto l1a = pldm_entity_association_tree_add(
820 tree, &entities[1], nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
821 EXPECT_NE(l1a, nullptr);
822
823 auto l2a = pldm_entity_association_tree_add(
824 tree, &entities[1], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
825 EXPECT_NE(l2a, nullptr);
826 auto l2b = pldm_entity_association_tree_add(tree, &entities[2], l1,
827 PLDM_ENTITY_ASSOCIAION_LOGICAL);
828 EXPECT_NE(l2b, nullptr);
829 auto l2c = pldm_entity_association_tree_add(
830 tree, &entities[3], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
831 EXPECT_NE(l2c, nullptr);
832 auto l2d = pldm_entity_association_tree_add(tree, &entities[4], l1,
833 PLDM_ENTITY_ASSOCIAION_LOGICAL);
834 EXPECT_NE(l2d, nullptr);
835
836 auto l3a = pldm_entity_association_tree_add(
837 tree, &entities[5], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
838 EXPECT_NE(l3a, nullptr);
839 auto l3b = pldm_entity_association_tree_add(
840 tree, &entities[6], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
841 EXPECT_NE(l3b, nullptr);
842 auto l3c = pldm_entity_association_tree_add(tree, &entities[7], l2a,
843 PLDM_ENTITY_ASSOCIAION_LOGICAL);
844 EXPECT_NE(l3c, nullptr);
845 auto l3d = pldm_entity_association_tree_add(tree, &entities[8], l2a,
846 PLDM_ENTITY_ASSOCIAION_LOGICAL);
847 EXPECT_NE(l3d, nullptr);
848
849 auto l4a = pldm_entity_association_tree_add(
850 tree, &entities[9], l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
851 EXPECT_NE(l4a, nullptr);
852 auto l4b = pldm_entity_association_tree_add(tree, &entities[10], l3b,
853 PLDM_ENTITY_ASSOCIAION_LOGICAL);
854 EXPECT_NE(l4b, nullptr);
855
856 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
857 2);
858 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
859 2);
860 EXPECT_EQ(
861 pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
862 EXPECT_EQ(
863 pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
864 EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
865 1);
866
867 auto repo = pldm_pdr_init();
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500868 pldm_entity_association_pdr_add(tree, repo, false);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500869
crgeddes2550cee2020-05-05 17:51:28 +0000870 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500871
872 uint32_t currRecHandle{};
873 uint32_t nextRecHandle{};
874 uint8_t* data = nullptr;
875 uint32_t size{};
876 uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
877 sizeof(uint8_t) + sizeof(pldm_entity) +
878 sizeof(uint8_t);
879
880 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
881 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
882 l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
883 sizeof(pldm_entity)));
884 uint8_t* start = data;
885 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000886 EXPECT_EQ(le32toh(hdr->record_handle), 1u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500887 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500888 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500889 start += sizeof(pldm_pdr_hdr);
890 uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000891 EXPECT_EQ(le16toh(*containerId), 1u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500892 start += sizeof(uint16_t);
893 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
894 start += sizeof(uint8_t);
895 pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000896 EXPECT_EQ(le16toh(entity->entity_type), 1u);
897 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
898 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500899 start += sizeof(pldm_entity);
900 EXPECT_EQ(*start,
901 pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
902 start += sizeof(uint8_t);
903 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000904 EXPECT_EQ(le16toh(entity->entity_type), 3u);
905 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
906 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500907 start += sizeof(pldm_entity);
908 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000909 EXPECT_EQ(le16toh(entity->entity_type), 3u);
910 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
911 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500912 start += sizeof(pldm_entity);
913
914 currRecHandle = nextRecHandle;
915
916 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
917 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
918 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
919 sizeof(pldm_entity)));
920 start = data;
921 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000922 EXPECT_EQ(le32toh(hdr->record_handle), 2u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500923 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500924 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500925 start += sizeof(pldm_pdr_hdr);
926 containerId = reinterpret_cast<uint16_t*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000927 EXPECT_EQ(le16toh(*containerId), 1u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500928 start += sizeof(uint16_t);
929 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
930 start += sizeof(uint8_t);
931 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000932 EXPECT_EQ(le16toh(entity->entity_type), 1u);
933 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
934 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500935 start += sizeof(pldm_entity);
936 EXPECT_EQ(*start, pldm_entity_get_num_children(
937 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
938 start += sizeof(uint8_t);
939 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000940 EXPECT_EQ(le16toh(entity->entity_type), 2u);
941 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
942 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500943 start += sizeof(pldm_entity);
944 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000945 EXPECT_EQ(le16toh(entity->entity_type), 2u);
946 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
947 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500948 start += sizeof(pldm_entity);
949
950 currRecHandle = nextRecHandle;
951
952 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
953 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
954 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
955 sizeof(pldm_entity)));
956 start = data;
957 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000958 EXPECT_EQ(le32toh(hdr->record_handle), 3u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500959 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500960 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500961 start += sizeof(pldm_pdr_hdr);
962 containerId = reinterpret_cast<uint16_t*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000963 EXPECT_EQ(le16toh(*containerId), 2u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500964 start += sizeof(uint16_t);
965 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
966 start += sizeof(uint8_t);
967 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000968 EXPECT_EQ(le16toh(entity->entity_type), 2u);
969 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
970 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500971 start += sizeof(pldm_entity);
972 EXPECT_EQ(*start, pldm_entity_get_num_children(
973 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
974 start += sizeof(uint8_t);
975 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500976 EXPECT_EQ(le16toh(entity->entity_type), 5);
crgeddes2550cee2020-05-05 17:51:28 +0000977 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
978 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500979 start += sizeof(pldm_entity);
980 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000981 EXPECT_EQ(le16toh(entity->entity_type), 5u);
982 EXPECT_EQ(le16toh(entity->entity_instance_num), 3u);
983 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500984 start += sizeof(pldm_entity);
985
986 currRecHandle = nextRecHandle;
987
988 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
989 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
990 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
991 sizeof(pldm_entity)));
992 start = data;
993 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000994 EXPECT_EQ(le32toh(hdr->record_handle), 4u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500995 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500996 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500997 start += sizeof(pldm_pdr_hdr);
998 containerId = reinterpret_cast<uint16_t*>(start);
crgeddes2550cee2020-05-05 17:51:28 +0000999 EXPECT_EQ(le16toh(*containerId), 2u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001000 start += sizeof(uint16_t);
1001 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1002 start += sizeof(uint8_t);
1003 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001004 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1005 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1006 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001007 start += sizeof(pldm_entity);
1008 EXPECT_EQ(*start, pldm_entity_get_num_children(
1009 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1010 start += sizeof(uint8_t);
1011 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001012 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1013 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1014 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001015 start += sizeof(pldm_entity);
1016 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001017 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1018 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1019 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001020 start += sizeof(pldm_entity);
1021
1022 currRecHandle = nextRecHandle;
1023
1024 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1025 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1026 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1027 sizeof(pldm_entity)));
1028 start = data;
1029 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001030 EXPECT_EQ(le32toh(hdr->record_handle), 5u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001031 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -05001032 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001033 start += sizeof(pldm_pdr_hdr);
1034 containerId = reinterpret_cast<uint16_t*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001035 EXPECT_EQ(le16toh(*containerId), 3u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001036 start += sizeof(uint16_t);
1037 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1038 start += sizeof(uint8_t);
1039 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001040 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1041 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1042 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001043 start += sizeof(pldm_entity);
1044 EXPECT_EQ(*start, pldm_entity_get_num_children(
1045 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1046 start += sizeof(uint8_t);
1047 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001048 EXPECT_EQ(le16toh(entity->entity_type), 6u);
1049 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1050 EXPECT_EQ(le16toh(entity->entity_container_id), 3u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001051 start += sizeof(pldm_entity);
1052
1053 currRecHandle = nextRecHandle;
1054
1055 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1056 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1057 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1058 sizeof(pldm_entity)));
1059 start = data;
1060 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001061 EXPECT_EQ(le32toh(hdr->record_handle), 6u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001062 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -05001063 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001064 start += sizeof(pldm_pdr_hdr);
1065 containerId = reinterpret_cast<uint16_t*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001066 EXPECT_EQ(le16toh(*containerId), 4u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001067 start += sizeof(uint16_t);
1068 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1069 start += sizeof(uint8_t);
1070 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001071 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1072 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1073 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001074 start += sizeof(pldm_entity);
1075 EXPECT_EQ(*start, pldm_entity_get_num_children(
1076 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1077 start += sizeof(uint8_t);
1078 entity = reinterpret_cast<pldm_entity*>(start);
crgeddes2550cee2020-05-05 17:51:28 +00001079 EXPECT_EQ(le16toh(entity->entity_type), 7u);
1080 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1081 EXPECT_EQ(le16toh(entity->entity_container_id), 4u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001082
crgeddes2550cee2020-05-05 17:51:28 +00001083 EXPECT_EQ(nextRecHandle, 0u);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -05001084
1085 pldm_pdr_destroy(repo);
1086 pldm_entity_association_tree_destroy(tree);
1087}
Deepak Kodihalli3b28ba82020-03-30 07:39:47 -05001088
1089TEST(EntityAssociationPDR, testFind)
1090{
1091 // 1
1092 // |
1093 // 2--3--4
1094 // |
1095 // 5--6--7
1096 // | |
1097 // 8 9
1098
1099 pldm_entity entities[9]{};
1100
1101 entities[0].entity_type = 1;
1102 entities[1].entity_type = 2;
1103 entities[2].entity_type = 2;
1104 entities[3].entity_type = 3;
1105 entities[4].entity_type = 4;
1106 entities[5].entity_type = 5;
1107 entities[6].entity_type = 5;
1108 entities[7].entity_type = 6;
1109 entities[8].entity_type = 7;
1110
1111 auto tree = pldm_entity_association_tree_init();
1112
1113 auto l1 = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
1114 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1115 EXPECT_NE(l1, nullptr);
1116 auto l2a = pldm_entity_association_tree_add(
1117 tree, &entities[1], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1118 EXPECT_NE(l2a, nullptr);
1119 auto l2b = pldm_entity_association_tree_add(
1120 tree, &entities[2], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1121 EXPECT_NE(l2b, nullptr);
1122 auto l2c = pldm_entity_association_tree_add(
1123 tree, &entities[3], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1124 EXPECT_NE(l2c, nullptr);
1125 auto l3a = pldm_entity_association_tree_add(
1126 tree, &entities[4], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1127 EXPECT_NE(l3a, nullptr);
1128 auto l3b = pldm_entity_association_tree_add(
1129 tree, &entities[5], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1130 EXPECT_NE(l3b, nullptr);
1131 auto l3c = pldm_entity_association_tree_add(
1132 tree, &entities[6], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1133 EXPECT_NE(l3c, nullptr);
1134 auto l4a = pldm_entity_association_tree_add(
1135 tree, &entities[7], l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1136 EXPECT_NE(l4a, nullptr);
1137 auto l4b = pldm_entity_association_tree_add(
1138 tree, &entities[8], l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1139 EXPECT_NE(l4b, nullptr);
1140
1141 pldm_entity entity{};
1142
1143 entity.entity_type = 1;
1144 entity.entity_instance_num = 1;
1145 auto result = pldm_entity_association_tree_find(tree, &entity);
1146 EXPECT_EQ(result, l1);
1147 EXPECT_EQ(entity.entity_container_id, 0);
1148
1149 entity.entity_type = 2;
1150 entity.entity_instance_num = 1;
1151 result = pldm_entity_association_tree_find(tree, &entity);
1152 EXPECT_EQ(result, l2a);
1153 EXPECT_EQ(entity.entity_container_id, 1);
1154 entity.entity_type = 2;
1155 entity.entity_instance_num = 2;
1156 result = pldm_entity_association_tree_find(tree, &entity);
1157 EXPECT_EQ(result, l2b);
1158 EXPECT_EQ(entity.entity_container_id, 1);
1159 entity.entity_type = 3;
1160 entity.entity_instance_num = 1;
1161 result = pldm_entity_association_tree_find(tree, &entity);
1162 EXPECT_EQ(result, l2c);
1163 EXPECT_EQ(entity.entity_container_id, 1);
1164
1165 entity.entity_type = 7;
1166 entity.entity_instance_num = 1;
1167 result = pldm_entity_association_tree_find(tree, &entity);
1168 EXPECT_EQ(result, l4b);
1169 EXPECT_EQ(entity.entity_container_id, 4);
1170
1171 pldm_entity_association_tree_destroy(tree);
1172}
1173
Sampa Misrac073a202021-05-08 10:56:05 -05001174TEST(EntityAssociationPDR, testCopyTree)
1175{
1176 pldm_entity entities[4]{};
1177 entities[0].entity_type = 1;
1178 entities[1].entity_type = 2;
1179 entities[2].entity_type = 2;
1180 entities[3].entity_type = 3;
1181
1182 auto orgTree = pldm_entity_association_tree_init();
1183 auto newTree = pldm_entity_association_tree_init();
1184 auto l1 = pldm_entity_association_tree_add(orgTree, &entities[0], nullptr,
1185 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1186 EXPECT_NE(l1, nullptr);
1187 auto l2a = pldm_entity_association_tree_add(
1188 orgTree, &entities[1], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1189 EXPECT_NE(l2a, nullptr);
1190 auto l2b = pldm_entity_association_tree_add(
1191 orgTree, &entities[2], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1192 EXPECT_NE(l2b, nullptr);
1193 auto l2c = pldm_entity_association_tree_add(
1194 orgTree, &entities[3], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1195 EXPECT_NE(l2c, nullptr);
1196 size_t orgNum{};
1197 pldm_entity* orgOut = nullptr;
1198 pldm_entity_association_tree_visit(orgTree, &orgOut, &orgNum);
1199 EXPECT_EQ(orgNum, 4u);
1200
1201 pldm_entity_association_tree_copy_root(orgTree, newTree);
1202 size_t newNum{};
1203 pldm_entity* newOut = nullptr;
1204 pldm_entity_association_tree_visit(newTree, &newOut, &newNum);
1205 EXPECT_EQ(newNum, orgNum);
1206 EXPECT_EQ(newOut[0].entity_type, 1u);
1207 EXPECT_EQ(newOut[0].entity_instance_num, 1u);
1208 EXPECT_EQ(newOut[0].entity_container_id, 0u);
1209 free(orgOut);
1210 free(newOut);
1211 pldm_entity_association_tree_destroy(orgTree);
1212 pldm_entity_association_tree_destroy(newTree);
1213}
1214
Deepak Kodihalli3b28ba82020-03-30 07:39:47 -05001215TEST(EntityAssociationPDR, testExtract)
1216{
1217 std::vector<uint8_t> pdr{};
1218 pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
1219 sizeof(pldm_entity) * 4);
1220 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
1221 hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
1222 hdr->length =
1223 htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 4);
1224
1225 pldm_pdr_entity_association* e =
1226 reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
1227 sizeof(pldm_pdr_hdr));
1228 e->container_id = htole16(1);
1229 e->num_children = 5;
1230 e->container.entity_type = htole16(1);
1231 e->container.entity_instance_num = htole16(1);
1232 e->container.entity_container_id = htole16(0);
1233
1234 pldm_entity* entity = e->children;
1235 entity->entity_type = htole16(2);
1236 entity->entity_instance_num = htole16(1);
1237 entity->entity_container_id = htole16(1);
1238 ++entity;
1239 entity->entity_type = htole16(3);
1240 entity->entity_instance_num = htole16(1);
1241 entity->entity_container_id = htole16(1);
1242 ++entity;
1243 entity->entity_type = htole16(4);
1244 entity->entity_instance_num = htole16(1);
1245 entity->entity_container_id = htole16(1);
1246 ++entity;
1247 entity->entity_type = htole16(5);
1248 entity->entity_instance_num = htole16(1);
1249 entity->entity_container_id = htole16(1);
1250 ++entity;
1251 entity->entity_type = htole16(6);
1252 entity->entity_instance_num = htole16(1);
1253 entity->entity_container_id = htole16(1);
1254
1255 size_t num{};
1256 pldm_entity* out = nullptr;
1257 pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
crgeddes2550cee2020-05-05 17:51:28 +00001258 EXPECT_EQ(num, (unsigned)e->num_children + 1);
1259 EXPECT_EQ(out[0].entity_type, 1u);
1260 EXPECT_EQ(out[0].entity_instance_num, 1u);
1261 EXPECT_EQ(out[0].entity_container_id, 0u);
1262 EXPECT_EQ(out[1].entity_type, 2u);
1263 EXPECT_EQ(out[1].entity_instance_num, 1u);
1264 EXPECT_EQ(out[1].entity_container_id, 1u);
1265 EXPECT_EQ(out[2].entity_type, 3u);
1266 EXPECT_EQ(out[2].entity_instance_num, 1u);
1267 EXPECT_EQ(out[2].entity_container_id, 1u);
1268 EXPECT_EQ(out[3].entity_type, 4u);
1269 EXPECT_EQ(out[3].entity_instance_num, 1u);
1270 EXPECT_EQ(out[3].entity_container_id, 1u);
1271 EXPECT_EQ(out[4].entity_type, 5u);
1272 EXPECT_EQ(out[4].entity_instance_num, 1u);
1273 EXPECT_EQ(out[4].entity_container_id, 1u);
1274 EXPECT_EQ(out[5].entity_type, 6u);
1275 EXPECT_EQ(out[5].entity_instance_num, 1u);
1276 EXPECT_EQ(out[5].entity_container_id, 1u);
Deepak Kodihalli3b28ba82020-03-30 07:39:47 -05001277
1278 free(out);
1279}