blob: 498afecf47551c238f69a8c97ef04cb77f6d7750 [file] [log] [blame]
Brad Bishope45d8c72022-05-25 15:12:53 -04001#include "fru_utils.hpp"
Patrick Venturea62466c2021-02-08 14:55:18 -08002
Andrew Jefferyf8ae2ba2022-03-25 15:13:55 +10303#include <algorithm>
Patrick Venturea62466c2021-02-08 14:55:18 -08004#include <array>
Andrew Jefferyf8ae2ba2022-03-25 15:13:55 +10305#include <iterator>
Patrick Venturea62466c2021-02-08 14:55:18 -08006
7#include "gtest/gtest.h"
8
Zev Weiss309c0b12022-02-25 01:44:12 +00009static constexpr size_t blockSize = I2C_SMBUS_BLOCK_MAX;
10
Zev Weisse6c86b72022-02-26 00:23:13 +000011TEST(ValidateIPMIHeaderTest, InvalidFruVersionReturnsFalse)
Patrick Venturea62466c2021-02-08 14:55:18 -080012{
13 // Validates the FruVersion is checked for the only legal value.
Zev Weisse6c86b72022-02-26 00:23:13 +000014 const std::vector<uint8_t> fruHeader = {0x00, 0x00, 0x00, 0x00,
15 0x00, 0x00, 0x00, 0x00};
Patrick Venturea62466c2021-02-08 14:55:18 -080016
Zev Weisse6c86b72022-02-26 00:23:13 +000017 EXPECT_FALSE(validateIPMIHeader(fruHeader));
Patrick Venturea62466c2021-02-08 14:55:18 -080018}
Vijay Khemka1694ef62021-02-12 23:14:49 +000019
Zev Weisse6c86b72022-02-26 00:23:13 +000020TEST(ValidateIPMIHeaderTest, InvalidReservedReturnsFalse)
Vijay Khemka7a682a32021-04-12 22:15:00 +000021{
22 // Validates the reserved bit(7:4) of first bytes.
Zev Weisse6c86b72022-02-26 00:23:13 +000023 const std::vector<uint8_t> fruHeader = {0xf0, 0x00, 0x00, 0x00,
24 0x00, 0x00, 0x00, 0x00};
Vijay Khemka7a682a32021-04-12 22:15:00 +000025
Zev Weisse6c86b72022-02-26 00:23:13 +000026 EXPECT_FALSE(validateIPMIHeader(fruHeader));
Vijay Khemka7a682a32021-04-12 22:15:00 +000027}
28
Zev Weisse6c86b72022-02-26 00:23:13 +000029TEST(ValidateIPMIHeaderTest, InvalidPaddingReturnsFalse)
Vijay Khemka7a682a32021-04-12 22:15:00 +000030{
31 // Validates the padding byte (7th byte).
Zev Weisse6c86b72022-02-26 00:23:13 +000032 const std::vector<uint8_t> fruHeader = {0x00, 0x00, 0x00, 0x00,
33 0x00, 0x00, 0x01, 0x00};
Vijay Khemka7a682a32021-04-12 22:15:00 +000034
Zev Weisse6c86b72022-02-26 00:23:13 +000035 EXPECT_FALSE(validateIPMIHeader(fruHeader));
Vijay Khemka7a682a32021-04-12 22:15:00 +000036}
37
Zev Weisse6c86b72022-02-26 00:23:13 +000038TEST(ValidateIPMIHeaderTest, InvalidChecksumReturnsFalse)
Vijay Khemka7a682a32021-04-12 22:15:00 +000039{
40 // Validates the checksum, check for incorrect value.
Zev Weisse6c86b72022-02-26 00:23:13 +000041 const std::vector<uint8_t> fruHeader = {0x01, 0x00, 0x01, 0x02,
42 0x03, 0x04, 0x00, 0x00};
Vijay Khemka7a682a32021-04-12 22:15:00 +000043
Zev Weisse6c86b72022-02-26 00:23:13 +000044 EXPECT_FALSE(validateIPMIHeader(fruHeader));
Vijay Khemka7a682a32021-04-12 22:15:00 +000045}
46
Zev Weisse6c86b72022-02-26 00:23:13 +000047TEST(ValidateIPMIHeaderTest, ValidChecksumReturnsTrue)
Vijay Khemka7a682a32021-04-12 22:15:00 +000048{
49 // Validates the checksum, check for correct value.
Zev Weisse6c86b72022-02-26 00:23:13 +000050 const std::vector<uint8_t> fruHeader = {0x01, 0x00, 0x01, 0x02,
51 0x03, 0x04, 0x00, 0xf5};
Vijay Khemka7a682a32021-04-12 22:15:00 +000052
Zev Weisse6c86b72022-02-26 00:23:13 +000053 EXPECT_TRUE(validateIPMIHeader(fruHeader));
Vijay Khemka7a682a32021-04-12 22:15:00 +000054}
55
Vijay Khemka1694ef62021-02-12 23:14:49 +000056TEST(VerifyOffsetTest, EmptyFruDataReturnsFalse)
57{
58 // Validates the FruData size is checked for non empty.
Ed Tanous07d467b2021-02-23 14:48:37 -080059 std::vector<uint8_t> fruData = {};
Vijay Khemka1694ef62021-02-12 23:14:49 +000060
Ed Tanous07d467b2021-02-23 14:48:37 -080061 EXPECT_FALSE(verifyOffset(fruData, fruAreas::fruAreaChassis, 0));
Vijay Khemka1694ef62021-02-12 23:14:49 +000062}
63
64TEST(VerifyOffsetTest, AreaOutOfRangeReturnsFalse)
65{
66 // Validates the FruArea value, check if it is within range.
Ed Tanous07d467b2021-02-23 14:48:37 -080067 const std::vector<uint8_t> fruData = {0x01, 0x00, 0x00, 0x00, 0x00,
68 0x00, 0x00, 0x00, 0x00};
Vijay Khemka1694ef62021-02-12 23:14:49 +000069
70 unsigned int areaOutOfRange = 8;
71 EXPECT_FALSE(
Ed Tanous07d467b2021-02-23 14:48:37 -080072 verifyOffset(fruData, static_cast<fruAreas>(areaOutOfRange), 0));
Vijay Khemka1694ef62021-02-12 23:14:49 +000073}
74
75TEST(VerifyOffsetTest, OverlapNextAreaReturnsFalse)
76{
77 // Validates the Overlap of offsets with overlapped values.
Ed Tanous07d467b2021-02-23 14:48:37 -080078 const std::vector<uint8_t> fruData = {0x01, 0x00, 0x01, 0x02, 0x03,
79 0x04, 0x00, 0x00, 0x00};
Vijay Khemka1694ef62021-02-12 23:14:49 +000080
Ed Tanous07d467b2021-02-23 14:48:37 -080081 EXPECT_FALSE(verifyOffset(fruData, fruAreas::fruAreaChassis, 2));
Vijay Khemka1694ef62021-02-12 23:14:49 +000082}
83
84TEST(VerifyOffsetTest, OverlapPrevAreaReturnsFalse)
85{
86 // Validates the Overlap of offsets with overlapped values.
Ed Tanous07d467b2021-02-23 14:48:37 -080087 const std::vector<uint8_t> fruData = {0x01, 0x00, 0x01, 0x03, 0x02,
88 0x07, 0x00, 0x00, 0x00};
Vijay Khemka1694ef62021-02-12 23:14:49 +000089
Ed Tanous07d467b2021-02-23 14:48:37 -080090 EXPECT_FALSE(verifyOffset(fruData, fruAreas::fruAreaProduct, 2));
Vijay Khemka1694ef62021-02-12 23:14:49 +000091}
92
93TEST(VerifyOffsetTest, ValidInputDataNoOverlapReturnsTrue)
94{
95 // Validates all inputs with expected value and no overlap.
Ed Tanous07d467b2021-02-23 14:48:37 -080096 const std::vector<uint8_t> fruData = {0x01, 0x00, 0x01, 0x02, 0x03,
97 0x04, 0x00, 0x00, 0x00};
Vijay Khemka1694ef62021-02-12 23:14:49 +000098
Ed Tanous07d467b2021-02-23 14:48:37 -080099 EXPECT_TRUE(verifyOffset(fruData, fruAreas::fruAreaChassis, 1));
Vijay Khemka1694ef62021-02-12 23:14:49 +0000100}
Andrew Jeffery8dacf6a2021-08-02 22:17:18 +0930101
102TEST(VerifyChecksumTest, EmptyInput)
103{
104 std::vector<uint8_t> data = {};
105
106 EXPECT_EQ(calculateChecksum(data), 0);
107}
108
109TEST(VerifyChecksumTest, SingleOneInput)
110{
111 std::vector<uint8_t> data(1, 1);
112
113 EXPECT_EQ(calculateChecksum(data), 255);
114}
115
116TEST(VerifyChecksumTest, AllOneInput)
117{
118 std::vector<uint8_t> data(256, 1);
119
120 EXPECT_EQ(calculateChecksum(data), 0);
121}
122
123TEST(VerifyChecksumTest, WrapBoundaryLow)
124{
Ed Tanousfbce8e22021-09-02 15:29:12 -0700125 std::vector<uint8_t> data = {255, 0};
Andrew Jeffery8dacf6a2021-08-02 22:17:18 +0930126
127 EXPECT_EQ(calculateChecksum(data), 1);
128}
129
130TEST(VerifyChecksumTest, WrapBoundaryExact)
131{
Ed Tanousfbce8e22021-09-02 15:29:12 -0700132 std::vector<uint8_t> data = {255, 1};
Andrew Jeffery8dacf6a2021-08-02 22:17:18 +0930133
134 EXPECT_EQ(calculateChecksum(data), 0);
135}
136
137TEST(VerifyChecksumTest, WrapBoundaryHigh)
138{
Ed Tanousfbce8e22021-09-02 15:29:12 -0700139 std::vector<uint8_t> data = {255, 2};
Andrew Jeffery8dacf6a2021-08-02 22:17:18 +0930140
141 EXPECT_EQ(calculateChecksum(data), 255);
142}
Oskar Senftbd4075f2021-10-05 23:42:43 -0400143
Zev Weiss309c0b12022-02-25 01:44:12 +0000144int64_t getDataTempl(const std::vector<uint8_t>& data, off_t offset,
Zev Weiss1525e852022-03-22 22:27:43 +0000145 size_t length, uint8_t* outBuf)
Oskar Senftbd4075f2021-10-05 23:42:43 -0400146{
Zev Weiss1525e852022-03-22 22:27:43 +0000147 if (offset >= static_cast<off_t>(data.size()))
Oskar Senftbd4075f2021-10-05 23:42:43 -0400148 {
149 return 0;
150 }
151
Ed Tanous3013fb42022-07-09 08:27:06 -0700152 uint16_t idx = offset;
153 // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
154 for (; idx < std::min(data.size(), offset + length); ++idx, ++outBuf)
Oskar Senftbd4075f2021-10-05 23:42:43 -0400155 {
156 *outBuf = data[idx];
157 }
158
159 return idx - offset;
160}
161
Zev Weiss309c0b12022-02-25 01:44:12 +0000162TEST(FRUReaderTest, ReadData)
163{
164 std::vector<uint8_t> data = {};
165 for (size_t i = 0; i < blockSize * 2; i++)
166 {
167 data.push_back(i);
168 }
Ed Tanous3013fb42022-07-09 08:27:06 -0700169 std::array<uint8_t, blockSize * 2> rdbuf{};
Zev Weiss309c0b12022-02-25 01:44:12 +0000170 auto getData = [&data](auto o, auto l, auto* b) {
171 return getDataTempl(data, o, l, b);
172 };
173 FRUReader reader(getData);
174
175 EXPECT_EQ(reader.read(0, data.size(), rdbuf.data()),
176 static_cast<ssize_t>(data.size()));
177 EXPECT_TRUE(std::equal(rdbuf.begin(), rdbuf.end(), data.begin()));
178 for (size_t i = 0; i < blockSize * 2; i++)
179 {
180 EXPECT_EQ(reader.read(i, 1, rdbuf.data()), 1);
181 EXPECT_EQ(rdbuf[i], i);
182 }
183 EXPECT_EQ(reader.read(blockSize - 1, 2, rdbuf.data()), 2);
184 EXPECT_EQ(rdbuf[0], blockSize - 1);
185 EXPECT_EQ(rdbuf[1], blockSize);
186}
187
188TEST(FRUReaderTest, StartPastUnknownEOF)
189{
190 const std::vector<uint8_t> data = {};
191 auto getData = [&data](auto o, auto l, auto* b) {
192 return getDataTempl(data, o, l, b);
193 };
194 FRUReader reader(getData);
195
196 EXPECT_EQ(reader.read(1, 1, nullptr), 0);
197}
198
199TEST(FRUReaderTest, StartPastKnownEOF)
200{
201 std::vector<uint8_t> data = {};
202 data.resize(blockSize / 2);
Ed Tanous3013fb42022-07-09 08:27:06 -0700203 std::array<uint8_t, blockSize> blockData{};
Zev Weiss309c0b12022-02-25 01:44:12 +0000204 auto getData = [&data](auto o, auto l, auto* b) {
205 return getDataTempl(data, o, l, b);
206 };
207 FRUReader reader(getData);
208
209 EXPECT_EQ(reader.read(0, blockSize, blockData.data()),
210 static_cast<ssize_t>(data.size()));
211 EXPECT_EQ(reader.read(data.size(), 1, nullptr), 0);
212 EXPECT_EQ(reader.read(data.size() + 1, 1, nullptr), 0);
213 EXPECT_EQ(reader.read(blockSize, 1, nullptr), 0);
214 EXPECT_EQ(reader.read(blockSize + 1, 1, nullptr), 0);
215}
216
217TEST(FRUReaderTest, DecreasingEOF)
218{
219 const std::vector<uint8_t> data = {};
220 auto getData = [&data](auto o, auto l, auto* b) {
221 return getDataTempl(data, o, l, b);
222 };
223 FRUReader reader(getData);
224
225 EXPECT_EQ(reader.read(blockSize * 2, 1, nullptr), 0);
226 EXPECT_EQ(reader.read(blockSize + (blockSize / 2), 1, nullptr), 0);
227 EXPECT_EQ(reader.read(blockSize, 1, nullptr), 0);
228 EXPECT_EQ(reader.read(blockSize / 2, 1, nullptr), 0);
229 EXPECT_EQ(reader.read(0, 1, nullptr), 0);
230}
231
232TEST(FRUReaderTest, CacheHit)
233{
234 std::vector<uint8_t> data = {'X'};
Ed Tanous3013fb42022-07-09 08:27:06 -0700235 std::array<uint8_t, blockSize> read1{};
236 std::array<uint8_t, blockSize> read2{};
Zev Weiss309c0b12022-02-25 01:44:12 +0000237 auto getData = [&data](auto o, auto l, auto* b) {
238 return getDataTempl(data, o, l, b);
239 };
240 FRUReader reader(getData);
241
242 // cache hit should return the same data for the second read even if we
243 // change it behind the FRUReader's back after the first
244 EXPECT_EQ(reader.read(0, blockSize, read1.data()), 1);
245 data[0] = 'Y';
246 EXPECT_EQ(reader.read(0, blockSize, read2.data()), 1);
247 EXPECT_EQ(read1[0], read2[0]);
248}
249
250TEST(FRUReaderTest, ReadPastKnownEnd)
251{
252 const std::vector<uint8_t> data = {'X', 'Y'};
Ed Tanous3013fb42022-07-09 08:27:06 -0700253 std::array<uint8_t, blockSize> rdbuf{};
Zev Weiss309c0b12022-02-25 01:44:12 +0000254 auto getData = [&data](auto o, auto l, auto* b) {
255 return getDataTempl(data, o, l, b);
256 };
257 FRUReader reader(getData);
258
259 EXPECT_EQ(reader.read(0, data.size(), rdbuf.data()),
260 static_cast<ssize_t>(data.size()));
261 EXPECT_EQ(rdbuf[0], 'X');
262 EXPECT_EQ(rdbuf[1], 'Y');
263 EXPECT_EQ(reader.read(1, data.size(), rdbuf.data()),
264 static_cast<ssize_t>(data.size() - 1));
265 EXPECT_EQ(rdbuf[0], 'Y');
266}
267
268TEST(FRUReaderTest, MultiBlockRead)
269{
270 std::vector<uint8_t> data = {};
271 data.resize(blockSize, 'X');
272 data.resize(2 * blockSize, 'Y');
Ed Tanous3013fb42022-07-09 08:27:06 -0700273 std::array<uint8_t, 2 * blockSize> rdbuf{};
Zev Weiss309c0b12022-02-25 01:44:12 +0000274 auto getData = [&data](auto o, auto l, auto* b) {
275 return getDataTempl(data, o, l, b);
276 };
277 FRUReader reader(getData);
278
279 EXPECT_EQ(reader.read(0, 2 * blockSize, rdbuf.data()),
280 static_cast<ssize_t>(2 * blockSize));
281 EXPECT_TRUE(std::equal(rdbuf.begin(), rdbuf.end(), data.begin()));
282}
283
284TEST(FRUReaderTest, ShrinkingEEPROM)
285{
286 std::vector<uint8_t> data = {};
287 data.resize(3 * blockSize, 'X');
Ed Tanous3013fb42022-07-09 08:27:06 -0700288 std::array<uint8_t, blockSize> rdbuf{};
Zev Weiss309c0b12022-02-25 01:44:12 +0000289 auto getData = [&data](auto o, auto l, auto* b) {
290 return getDataTempl(data, o, l, b);
291 };
292 FRUReader reader(getData);
293
294 EXPECT_EQ(reader.read(data.size() - 1, 2, rdbuf.data()), 1);
295 data.resize(blockSize);
296 EXPECT_EQ(reader.read(data.size() - 1, 2, rdbuf.data()), 1);
297}
298
Zev Weisse6c86b72022-02-26 00:23:13 +0000299static constexpr auto testFRUData = std::to_array<uint8_t>({
300 0x01, 0x00, 0x01, 0x05, 0x0d, 0x00, 0x00, 0xec, 0x01, 0x04, 0x11, 0xd1,
301 0x4f, 0x42, 0x4d, 0x43, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x48,
302 0x41, 0x53, 0x53, 0x49, 0x53, 0xc6, 0x58, 0x59, 0x5a, 0x31, 0x32, 0x33,
303 0xc1, 0x00, 0x00, 0xc4, 0x01, 0x08, 0x19, 0xd8, 0xe7, 0xd1, 0xcf, 0x4f,
304 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65,
305 0x63, 0x74, 0xcf, 0x4f, 0x42, 0x4d, 0x43, 0x5f, 0x54, 0x45, 0x53, 0x54,
306 0x5f, 0x42, 0x4f, 0x41, 0x52, 0x44, 0xc6, 0x41, 0x42, 0x43, 0x30, 0x31,
307 0x32, 0xcd, 0x42, 0x4f, 0x41, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54,
308 0x4e, 0x55, 0x4d, 0xc0, 0xc1, 0x00, 0x00, 0x73, 0x01, 0x06, 0x19, 0xcf,
309 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x20, 0x50, 0x72, 0x6f, 0x6a,
310 0x65, 0x63, 0x74, 0xd1, 0x4f, 0x42, 0x4d, 0x43, 0x5f, 0x54, 0x45, 0x53,
311 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0xc0, 0xc0, 0xc4,
312 0x39, 0x39, 0x39, 0x39, 0xc0, 0xc0, 0xc1, 0x3c,
313});
314
315TEST(ReadFRUContentsTest, InvalidHeader)
Oskar Senftbd4075f2021-10-05 23:42:43 -0400316{
317 const std::vector<uint8_t> data = {255, 16};
Zev Weiss309c0b12022-02-25 01:44:12 +0000318 auto getData = [&data](auto o, auto l, auto* b) {
319 return getDataTempl(data, o, l, b);
Andrew Jefferyf8ae2ba2022-03-25 15:13:55 +1030320 };
Zev Weiss309c0b12022-02-25 01:44:12 +0000321 FRUReader reader(getData);
Oskar Senftbd4075f2021-10-05 23:42:43 -0400322
Zev Weisse6c86b72022-02-26 00:23:13 +0000323 EXPECT_TRUE(readFRUContents(reader, "error").empty());
Oskar Senftbd4075f2021-10-05 23:42:43 -0400324}
325
Zev Weisse6c86b72022-02-26 00:23:13 +0000326TEST(ReadFRUContentsTest, NoData)
Oskar Senftbd4075f2021-10-05 23:42:43 -0400327{
328 const std::vector<uint8_t> data = {};
Zev Weiss309c0b12022-02-25 01:44:12 +0000329 auto getData = [&data](auto o, auto l, auto* b) {
330 return getDataTempl(data, o, l, b);
Andrew Jefferyf8ae2ba2022-03-25 15:13:55 +1030331 };
Zev Weiss309c0b12022-02-25 01:44:12 +0000332 FRUReader reader(getData);
Oskar Senftbd4075f2021-10-05 23:42:43 -0400333
Zev Weisse6c86b72022-02-26 00:23:13 +0000334 EXPECT_TRUE(readFRUContents(reader, "error").empty());
Oskar Senftbd4075f2021-10-05 23:42:43 -0400335}
336
Zev Weisse6c86b72022-02-26 00:23:13 +0000337TEST(ReadFRUContentsTest, IPMIValidData)
Oskar Senftbd4075f2021-10-05 23:42:43 -0400338{
Zev Weisse6c86b72022-02-26 00:23:13 +0000339 const std::vector<uint8_t> data(testFRUData.begin(), testFRUData.end());
Zev Weiss309c0b12022-02-25 01:44:12 +0000340 auto getData = [&data](auto o, auto l, auto* b) {
341 return getDataTempl(data, o, l, b);
Andrew Jefferyf8ae2ba2022-03-25 15:13:55 +1030342 };
Zev Weiss309c0b12022-02-25 01:44:12 +0000343 FRUReader reader(getData);
Oskar Senftbd4075f2021-10-05 23:42:43 -0400344
Zev Weisse6c86b72022-02-26 00:23:13 +0000345 EXPECT_EQ(readFRUContents(reader, "error"), data);
Oskar Senftbd4075f2021-10-05 23:42:43 -0400346}
347
Zev Weisse6c86b72022-02-26 00:23:13 +0000348TEST(ReadFRUContentsTest, IPMIInvalidData)
349{
350 std::vector<uint8_t> data(testFRUData.begin(), testFRUData.end());
351 // corrupt a byte to throw off the checksum
352 data[7] ^= 0xff;
353 auto getData = [&data](auto o, auto l, auto* b) {
354 return getDataTempl(data, o, l, b);
355 };
356 FRUReader reader(getData);
357
358 EXPECT_TRUE(readFRUContents(reader, "error").empty());
359}
360
361TEST(ReadFRUContentsTest, TyanInvalidHeader)
Oskar Senftbd4075f2021-10-05 23:42:43 -0400362{
363 std::vector<uint8_t> data = {'$', 'T', 'Y', 'A', 'N', '$', 0, 0};
Zev Weisse6c86b72022-02-26 00:23:13 +0000364 data.resize(0x6000 + 32);
Zev Weiss309c0b12022-02-25 01:44:12 +0000365 auto getData = [&data](auto o, auto l, auto* b) {
366 return getDataTempl(data, o, l, b);
Andrew Jefferyf8ae2ba2022-03-25 15:13:55 +1030367 };
Zev Weiss309c0b12022-02-25 01:44:12 +0000368 FRUReader reader(getData);
Oskar Senftbd4075f2021-10-05 23:42:43 -0400369
Zev Weisse6c86b72022-02-26 00:23:13 +0000370 EXPECT_TRUE(readFRUContents(reader, "error").empty());
Oskar Senftbd4075f2021-10-05 23:42:43 -0400371}
372
Zev Weisse6c86b72022-02-26 00:23:13 +0000373TEST(ReadFRUContentsTest, TyanNoData)
Oskar Senftbd4075f2021-10-05 23:42:43 -0400374{
375 const std::vector<uint8_t> data = {'$', 'T', 'Y', 'A', 'N', '$', 0, 0};
Zev Weiss309c0b12022-02-25 01:44:12 +0000376 auto getData = [&data](auto o, auto l, auto* b) {
377 return getDataTempl(data, o, l, b);
Andrew Jefferyf8ae2ba2022-03-25 15:13:55 +1030378 };
Zev Weiss309c0b12022-02-25 01:44:12 +0000379 FRUReader reader(getData);
Oskar Senftbd4075f2021-10-05 23:42:43 -0400380
Zev Weisse6c86b72022-02-26 00:23:13 +0000381 EXPECT_TRUE(readFRUContents(reader, "error").empty());
Oskar Senftbd4075f2021-10-05 23:42:43 -0400382}
383
Zev Weisse6c86b72022-02-26 00:23:13 +0000384TEST(ReadFRUContentsTest, TyanValidData)
Oskar Senftbd4075f2021-10-05 23:42:43 -0400385{
386 std::vector<uint8_t> data = {'$', 'T', 'Y', 'A', 'N', '$', 0, 0};
387 data.resize(0x6000);
Zev Weisse6c86b72022-02-26 00:23:13 +0000388 copy(testFRUData.begin(), testFRUData.end(), back_inserter(data));
Oskar Senftbd4075f2021-10-05 23:42:43 -0400389
Zev Weiss309c0b12022-02-25 01:44:12 +0000390 auto getData = [&data](auto o, auto l, auto* b) {
391 return getDataTempl(data, o, l, b);
Andrew Jefferyf8ae2ba2022-03-25 15:13:55 +1030392 };
Zev Weiss309c0b12022-02-25 01:44:12 +0000393 FRUReader reader(getData);
Oskar Senftbd4075f2021-10-05 23:42:43 -0400394
Zev Weisse6c86b72022-02-26 00:23:13 +0000395 std::vector<uint8_t> device = readFRUContents(reader, "error");
396 EXPECT_TRUE(std::equal(device.begin(), device.end(), testFRUData.begin()));
Oskar Senftbd4075f2021-10-05 23:42:43 -0400397}