1 // Copyright 2021 The Pigweed Authors
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
7 // https://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
15 #include "pw_hdlc/wire_packet_parser.h"
17 #include "gtest/gtest.h"
18 #include "pw_bytes/array.h"
19 #include "pw_hdlc_private/protocol.h"
24 constexpr uint8_t kAddress = 0x6a;
25 constexpr uint8_t kControl = 0x03;
27 TEST(WirePacketParser, Parse_ValidPacket) {
28 WirePacketParser parser;
29 EXPECT_TRUE(parser.Parse(bytes::Concat(
30 kFlag, kAddress, kControl, bytes::String("hello"), 0xc40cefe0, kFlag)));
31 auto maybe_address = parser.GetDestinationAddress();
32 EXPECT_TRUE(maybe_address.has_value());
33 EXPECT_EQ(maybe_address.value(), kAddress);
36 TEST(WirePacketParser, Parse_EscapedAddress) {
37 WirePacketParser parser;
38 EXPECT_TRUE(parser.Parse(bytes::Concat(kFlag,
42 bytes::String("hello"),
45 auto maybe_address = parser.GetDestinationAddress();
46 EXPECT_TRUE(maybe_address.has_value());
47 EXPECT_EQ(maybe_address.value(), 0x7eu);
50 TEST(WirePacketParser, Parse_EscapedPayload) {
51 WirePacketParser parser;
52 EXPECT_TRUE(parser.Parse(bytes::Concat(kFlag,
55 bytes::String("hello"),
57 bytes::String("world"),
60 auto maybe_address = parser.GetDestinationAddress();
61 EXPECT_TRUE(maybe_address.has_value());
62 EXPECT_EQ(maybe_address.value(), kAddress);
65 TEST(WirePacketParser, Parse_EscapedFcs) {
66 WirePacketParser parser;
67 EXPECT_TRUE(parser.Parse(bytes::Concat(kFlag,
70 bytes::String("qwertyu"),
72 bytes::String("\x3b\xe9\x7d\x5d\xe0"),
74 auto maybe_address = parser.GetDestinationAddress();
75 EXPECT_TRUE(maybe_address.has_value());
76 EXPECT_EQ(maybe_address.value(), kAddress);
79 TEST(WirePacketParser, Parse_MultipleEscapes) {
80 WirePacketParser parser;
81 EXPECT_TRUE(parser.Parse(bytes::Concat(kFlag,
89 auto maybe_address = parser.GetDestinationAddress();
90 EXPECT_TRUE(maybe_address.has_value());
91 EXPECT_EQ(maybe_address.value(), static_cast<uint32_t>(kFlag));
94 TEST(WirePacketParser, Parse_AddressBits) {
95 WirePacketParser parser(4);
96 EXPECT_TRUE(parser.Parse(bytes::Concat(kFlag,
99 bytes::String("hello"),
102 auto maybe_address = parser.GetDestinationAddress();
103 EXPECT_TRUE(maybe_address.has_value());
104 EXPECT_EQ(maybe_address.value(), 0xau);
107 TEST(WirePacketParser, Parse_BadFcs) {
108 WirePacketParser parser;
109 EXPECT_FALSE(parser.Parse(bytes::Concat(
110 kFlag, kAddress, kControl, bytes::String("hello"), 0x1badda7a, kFlag)));
113 TEST(WirePacketParser, Parse_DoubleEscape) {
114 WirePacketParser parser;
115 EXPECT_FALSE(parser.Parse(bytes::Concat(
116 kFlag, kAddress, kControl, bytes::String("hello"), 0x01027d7d, kFlag)));
119 TEST(WirePacketParser, Parse_FlagInFrame) {
120 WirePacketParser parser;
121 EXPECT_FALSE(parser.Parse(bytes::Concat(
122 kFlag, kAddress, kControl, bytes::String("he~lo"), 0xdbae98fe, kFlag)));
125 TEST(WirePacketParser, Parse_EmptyPacket) {
126 WirePacketParser parser;
127 EXPECT_FALSE(parser.Parse({}));
131 } // namespace pw::hdlc