xref: /openbmc/phosphor-host-ipmid/transport/serialbridge/test/serial_unittest.cpp (revision c0d01c87c3f0bca8ef949f33c13226d540624cda)
1 #include <transport/serialbridge/serialcmd.hpp>
2 
3 #include <gtest/gtest.h>
4 
5 namespace serialbridge
6 {
7 
8 /**
9  * @brief Table of special characters
10  */
11 std::unordered_map<uint8_t, uint8_t> testsets = {
12     {bmStart, 0xB0},     /* start */
13     {bmStop, 0xB5},      /* stop */
14     {bmHandshake, 0xB6}, /* packet handshake */
15     {bmEscape, 0xBA},    /* data escape */
16     {0x1B, 0x3B}         /* escape */
17 };
18 
TEST(TestSpecialCharact,getUnescapedCharact)19 TEST(TestSpecialCharact, getUnescapedCharact)
20 {
21     auto channel = std::make_shared<SerialChannel>(0);
22 
23     for (const auto& set : testsets)
24     {
25         uint8_t c = channel->getUnescapedCharacter(set.second);
26         ASSERT_EQ(c, set.first);
27     }
28 }
29 
TEST(TestSpecialCharact,processEscapedCharacter)30 TEST(TestSpecialCharact, processEscapedCharacter)
31 {
32     std::vector<uint8_t> buffer;
33     uint8_t unescaped = 0xd0;
34     auto channel = std::make_shared<SerialChannel>(0);
35 
36     channel->processEscapedCharacter(buffer, std::vector<uint8_t>{bmStart});
37 
38     ASSERT_EQ(buffer.at(0), bmEscape);
39     ASSERT_EQ(buffer.at(1), testsets.at(bmStart));
40 
41     buffer.clear();
42     channel->processEscapedCharacter(buffer, std::vector<uint8_t>{unescaped});
43 
44     ASSERT_EQ(buffer.at(0), unescaped);
45 }
46 
TEST(TestChecksum,calculateChecksum)47 TEST(TestChecksum, calculateChecksum)
48 {
49     std::array<uint8_t, 5> dataBytes{0x01, 0x10, 0x60, 0xf0, 0x50};
50     auto channel = std::make_shared<SerialChannel>(0);
51 
52     uint8_t checksum =
53         channel->calculateChecksum(std::span<uint8_t>(dataBytes));
54 
55     checksum += (~checksum) + 1;
56     ASSERT_EQ(checksum, 0);
57 }
58 
TEST(TestIpmiSerialPacket,consumeIpmiSerialPacket)59 TEST(TestIpmiSerialPacket, consumeIpmiSerialPacket)
60 {
61     std::vector<uint8_t> dataBytes{bmStart, 0x20, 0x18, 0xc8, 0x81,
62                                    0xc,     0x46, 0x01, 0x2c, bmStop};
63     std::vector<uint8_t> dataBytesSplit1{bmStart, 0x20, 0x18, 0xc8};
64     std::vector<uint8_t> dataBytesSplit2{0x81, 0xc, 0x46, 0x01, 0x2c, bmStop};
65     std::span<uint8_t> input(dataBytes);
66     std::span<uint8_t> input1(dataBytesSplit1);
67     std::span<uint8_t> input2(dataBytesSplit2);
68     std::vector<uint8_t> output;
69 
70     auto channel = std::make_shared<SerialChannel>(0);
71 
72     auto result = channel->consumeIpmiSerialPacket(input, output);
73 
74     ASSERT_EQ(result, true);
75 
76     output.clear();
77     result = channel->consumeIpmiSerialPacket(input1, output);
78     ASSERT_EQ(result, false);
79     result = channel->consumeIpmiSerialPacket(input2, output);
80     ASSERT_EQ(result, true);
81 }
82 
83 } // namespace serialbridge
84