blob: 3fb0227d73acb32bbd87641ffcf5eddcd5ae01e6 [file] [log] [blame]
John Chunge2fae4b2024-11-13 18:10:31 -06001#include <transport/serialbridge/serialcmd.hpp>
2
3#include <gtest/gtest.h>
4
5namespace serialbridge
6{
7
8/**
9 * @brief Table of special characters
10 */
11std::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
19TEST(TestSpecialCharact, getUnescapedCharact)
20{
21 uint8_t c;
22 auto channel = std::make_shared<SerialChannel>(0);
23
24 for (const auto& set : testsets)
25 {
26 c = channel->getUnescapedCharacter(set.second);
27 ASSERT_EQ(c, set.first);
28 }
29}
30
31TEST(TestSpecialCharact, processEscapedCharacter)
32{
33 std::vector<uint8_t> buffer;
34 uint8_t unescaped = 0xd0;
35 auto channel = std::make_shared<SerialChannel>(0);
36
37 channel->processEscapedCharacter(buffer, std::vector<uint8_t>{bmStart});
38
39 ASSERT_EQ(buffer.at(0), bmEscape);
40 ASSERT_EQ(buffer.at(1), testsets.at(bmStart));
41
42 buffer.clear();
43 channel->processEscapedCharacter(buffer, std::vector<uint8_t>{unescaped});
44
45 ASSERT_EQ(buffer.at(0), unescaped);
46}
47
48TEST(TestChecksum, calculateChecksum)
49{
50 std::array<uint8_t, 5> dataBytes{0x01, 0x10, 0x60, 0xf0, 0x50};
51 auto channel = std::make_shared<SerialChannel>(0);
52
53 uint8_t checksum =
54 channel->calculateChecksum(std::span<uint8_t>(dataBytes));
55
56 checksum += (~checksum) + 1;
57 ASSERT_EQ(checksum, 0);
58}
59
60TEST(TestIpmiSerialPacket, consumeIpmiSerialPacket)
61{
62 std::vector<uint8_t> dataBytes{bmStart, 0x20, 0x18, 0xc8, 0x81,
63 0xc, 0x46, 0x01, 0x2c, bmStop};
64 std::vector<uint8_t> dataBytesSplit1{bmStart, 0x20, 0x18, 0xc8};
65 std::vector<uint8_t> dataBytesSplit2{0x81, 0xc, 0x46, 0x01, 0x2c, bmStop};
66 std::span<uint8_t> input(dataBytes);
67 std::span<uint8_t> input1(dataBytesSplit1);
68 std::span<uint8_t> input2(dataBytesSplit2);
69 std::vector<uint8_t> output;
70
71 auto channel = std::make_shared<SerialChannel>(0);
72
73 auto result = channel->consumeIpmiSerialPacket(input, output);
74
75 ASSERT_EQ(result, true);
76
77 output.clear();
78 result = channel->consumeIpmiSerialPacket(input1, output);
79 ASSERT_EQ(result, false);
80 result = channel->consumeIpmiSerialPacket(input2, output);
81 ASSERT_EQ(result, true);
82}
83
84} // namespace serialbridge