xref: /openbmc/bmcweb/test/redfish-core/include/utils/hex_utils_test.cpp (revision 40e9b92ec19acffb46f83a6e55b18974da5d708e)
1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors
3 #include "utils/hex_utils.hpp"
4 
5 #include <cctype>
6 #include <cstdint>
7 #include <limits>
8 #include <vector>
9 
10 #include <gmock/gmock.h>
11 #include <gtest/gtest.h>
12 
13 namespace
14 {
15 
16 using ::testing::IsEmpty;
17 
TEST(IntToHexString,ReturnsCorrectHexForUint64)18 TEST(IntToHexString, ReturnsCorrectHexForUint64)
19 {
20     EXPECT_EQ(intToHexString(0xFFFFFFFFFFFFFFFFULL, 16), "FFFFFFFFFFFFFFFF");
21 
22     EXPECT_EQ(intToHexString(0, 4), "0000");
23     EXPECT_EQ(intToHexString(0, 8), "00000000");
24     EXPECT_EQ(intToHexString(0, 12), "000000000000");
25     EXPECT_EQ(intToHexString(0, 16), "0000000000000000");
26 
27     // uint64_t sized ints
28     EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 4), "F00D");
29     EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 8), "BAD4F00D");
30     EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 12), "BEEFBAD4F00D");
31     EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 16), "DEADBEEFBAD4F00D");
32 
33     // uint16_t sized ints
34     EXPECT_EQ(intToHexString(0xBEEF, 1), "F");
35     EXPECT_EQ(intToHexString(0xBEEF, 2), "EF");
36     EXPECT_EQ(intToHexString(0xBEEF, 3), "EEF");
37     EXPECT_EQ(intToHexString(0xBEEF, 4), "BEEF");
38 }
39 
TEST(BytesToHexString,OnSuccess)40 TEST(BytesToHexString, OnSuccess)
41 {
42     EXPECT_EQ(bytesToHexString({0x1a, 0x2b}), "1A2B");
43 }
44 
TEST(HexCharToNibble,ReturnsCorrectNibbleForEveryHexChar)45 TEST(HexCharToNibble, ReturnsCorrectNibbleForEveryHexChar)
46 {
47     for (char c = 0; c < std::numeric_limits<char>::max(); ++c)
48     {
49         uint8_t expected = 16;
50         if (isdigit(c) != 0)
51         {
52             expected = static_cast<uint8_t>(c) - '0';
53         }
54         else if (c >= 'A' && c <= 'F')
55         {
56             expected = static_cast<uint8_t>(c - 'A') + 10U;
57         }
58         else if (c >= 'a' && c <= 'f')
59         {
60             expected = static_cast<uint8_t>(c - 'a') + 10U;
61         }
62 
63         EXPECT_EQ(hexCharToNibble(c), expected);
64     }
65 }
66 
TEST(HexStringToBytes,Success)67 TEST(HexStringToBytes, Success)
68 {
69     std::vector<uint8_t> hexBytes = {0x01, 0x23, 0x45, 0x67,
70                                      0x89, 0xAB, 0xCD, 0xEF};
71     EXPECT_EQ(hexStringToBytes("0123456789ABCDEF"), hexBytes);
72     EXPECT_THAT(hexStringToBytes(""), IsEmpty());
73 }
74 
TEST(HexStringToBytes,Failure)75 TEST(HexStringToBytes, Failure)
76 {
77     EXPECT_THAT(hexStringToBytes("Hello"), IsEmpty());
78     EXPECT_THAT(hexStringToBytes("`"), IsEmpty());
79     EXPECT_THAT(hexStringToBytes("012"), IsEmpty());
80 }
81 
82 } // namespace
83