1 #include "FruUtils.hpp"
2 
3 #include <array>
4 
5 #include "gtest/gtest.h"
6 
7 extern "C"
8 {
9 // Include for I2C_SMBUS_BLOCK_MAX
10 #include <linux/i2c.h>
11 }
12 
13 TEST(ValidateHeaderTest, InvalidFruVersionReturnsFalse)
14 {
15     // Validates the FruVersion is checked for the only legal value.
16     constexpr std::array<uint8_t, I2C_SMBUS_BLOCK_MAX> fruHeader = {
17         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
18 
19     EXPECT_FALSE(validateHeader(fruHeader));
20 }
21 
22 TEST(ValidateHeaderTest, InvalidReservedReturnsFalse)
23 {
24     // Validates the reserved bit(7:4) of first bytes.
25     constexpr std::array<uint8_t, I2C_SMBUS_BLOCK_MAX> fruHeader = {
26         0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
27 
28     EXPECT_FALSE(validateHeader(fruHeader));
29 }
30 
31 TEST(ValidateHeaderTest, InvalidPaddingReturnsFalse)
32 {
33     // Validates the padding byte (7th byte).
34     constexpr std::array<uint8_t, I2C_SMBUS_BLOCK_MAX> fruHeader = {
35         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00};
36 
37     EXPECT_FALSE(validateHeader(fruHeader));
38 }
39 
40 TEST(ValidateHeaderTest, InvalidChecksumReturnsFalse)
41 {
42     // Validates the checksum, check for incorrect value.
43     constexpr std::array<uint8_t, I2C_SMBUS_BLOCK_MAX> fruHeader = {
44         0x01, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00};
45 
46     EXPECT_FALSE(validateHeader(fruHeader));
47 }
48 
49 TEST(ValidateHeaderTest, ValidChecksumReturnsTrue)
50 {
51     // Validates the checksum, check for correct value.
52     constexpr std::array<uint8_t, I2C_SMBUS_BLOCK_MAX> fruHeader = {
53         0x01, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0xf5};
54 
55     EXPECT_TRUE(validateHeader(fruHeader));
56 }
57 
58 TEST(VerifyOffsetTest, EmptyFruDataReturnsFalse)
59 {
60     // Validates the FruData size is checked for non empty.
61     std::vector<uint8_t> fruData = {};
62 
63     EXPECT_FALSE(verifyOffset(fruData, fruAreas::fruAreaChassis, 0));
64 }
65 
66 TEST(VerifyOffsetTest, AreaOutOfRangeReturnsFalse)
67 {
68     // Validates the FruArea value, check if it is within range.
69     const std::vector<uint8_t> fruData = {0x01, 0x00, 0x00, 0x00, 0x00,
70                                           0x00, 0x00, 0x00, 0x00};
71 
72     unsigned int areaOutOfRange = 8;
73     EXPECT_FALSE(
74         verifyOffset(fruData, static_cast<fruAreas>(areaOutOfRange), 0));
75 }
76 
77 TEST(VerifyOffsetTest, OverlapNextAreaReturnsFalse)
78 {
79     // Validates the Overlap of offsets with overlapped values.
80     const std::vector<uint8_t> fruData = {0x01, 0x00, 0x01, 0x02, 0x03,
81                                           0x04, 0x00, 0x00, 0x00};
82 
83     EXPECT_FALSE(verifyOffset(fruData, fruAreas::fruAreaChassis, 2));
84 }
85 
86 TEST(VerifyOffsetTest, OverlapPrevAreaReturnsFalse)
87 {
88     // Validates the Overlap of offsets with overlapped values.
89     const std::vector<uint8_t> fruData = {0x01, 0x00, 0x01, 0x03, 0x02,
90                                           0x07, 0x00, 0x00, 0x00};
91 
92     EXPECT_FALSE(verifyOffset(fruData, fruAreas::fruAreaProduct, 2));
93 }
94 
95 TEST(VerifyOffsetTest, ValidInputDataNoOverlapReturnsTrue)
96 {
97     // Validates all inputs with expected value and no overlap.
98     const std::vector<uint8_t> fruData = {0x01, 0x00, 0x01, 0x02, 0x03,
99                                           0x04, 0x00, 0x00, 0x00};
100 
101     EXPECT_TRUE(verifyOffset(fruData, fruAreas::fruAreaChassis, 1));
102 }
103 
104 TEST(VerifyChecksumTest, EmptyInput)
105 {
106     std::vector<uint8_t> data = {};
107 
108     EXPECT_EQ(calculateChecksum(data), 0);
109 }
110 
111 TEST(VerifyChecksumTest, SingleOneInput)
112 {
113     std::vector<uint8_t> data(1, 1);
114 
115     EXPECT_EQ(calculateChecksum(data), 255);
116 }
117 
118 TEST(VerifyChecksumTest, AllOneInput)
119 {
120     std::vector<uint8_t> data(256, 1);
121 
122     EXPECT_EQ(calculateChecksum(data), 0);
123 }
124 
125 TEST(VerifyChecksumTest, WrapBoundaryLow)
126 {
127     std::vector<uint8_t> data = { 255, 0 };
128 
129     EXPECT_EQ(calculateChecksum(data), 1);
130 }
131 
132 TEST(VerifyChecksumTest, WrapBoundaryExact)
133 {
134     std::vector<uint8_t> data = { 255, 1 };
135 
136     EXPECT_EQ(calculateChecksum(data), 0);
137 }
138 
139 TEST(VerifyChecksumTest, WrapBoundaryHigh)
140 {
141     std::vector<uint8_t> data = { 255, 2 };
142 
143     EXPECT_EQ(calculateChecksum(data), 255);
144 }
145