blob: a7e29389fde035a3897460db57918aaa3452b978 [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{
John Chunge2fae4b2024-11-13 18:10:31 -060021 auto channel = std::make_shared<SerialChannel>(0);
22
23 for (const auto& set : testsets)
24 {
George Liuc0d01c82025-07-08 16:14:36 +080025 uint8_t c = channel->getUnescapedCharacter(set.second);
John Chunge2fae4b2024-11-13 18:10:31 -060026 ASSERT_EQ(c, set.first);
27 }
28}
29
30TEST(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
47TEST(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
59TEST(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