blob: f99b54c2d328f0d46a3289518f2ae6c0e008f7d6 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "frame.h"
#include <vector>
#include <zxtest/zxtest.h>
namespace {
TEST(FrameTestCase, SerializeFrameEmpty) {
const std::vector<uint8_t> information = {};
const std::vector<uint8_t> expect = {
0x7e, 0xff, 0x7d, 0x23, 0xc2, 0x23, 0xeb, 0x3c, 0x7e,
};
const ppp::FrameView frame(ppp::Protocol::ChallengeHandshakeAuthentication, information);
const std::vector<uint8_t> raw_frame = ppp::SerializeFrame(frame);
ASSERT_EQ(raw_frame.size(), expect.size());
ASSERT_BYTES_EQ(raw_frame.data(), expect.data(), expect.size());
}
TEST(FrameTestCase, SerializeFrameNoEscape) {
const std::vector<uint8_t> information = {0x89, 0xab, 0xde};
const std::vector<uint8_t> expect = {
0x7e, 0xff, 0x7d, 0x23, 0xc0, 0x23, 0x89, 0xab, 0xde, 0x7d, 0x37, 0x7d, 0x2b, 0x7e,
};
const ppp::FrameView frame(ppp::Protocol::PasswordAuthentication, information);
const std::vector<uint8_t> raw_frame = ppp::SerializeFrame(frame);
ASSERT_EQ(raw_frame.size(), expect.size());
ASSERT_BYTES_EQ(raw_frame.data(), expect.data(), expect.size());
}
TEST(FrameTestCase, SerializeFrameEscapeFlagSequence) {
const std::vector<uint8_t> information = {0xaa, 0x7e, 0xaa};
const std::vector<uint8_t> expect = {
0x7e, 0xff, 0x7d, 0x23, 0x80, 0x57, 0xaa, 0x7d, 0x5e, 0xaa, 0xe3, 0x7d, 0x3a, 0x7e,
};
const ppp::FrameView frame(ppp::Protocol::Ipv6Control, information);
const std::vector<uint8_t> raw_frame = ppp::SerializeFrame(frame);
ASSERT_EQ(raw_frame.size(), expect.size());
ASSERT_BYTES_EQ(raw_frame.data(), expect.data(), expect.size());
}
TEST(FrameTestCase, SerializeFrameEscapeEscaped) {
const std::vector<uint8_t> information = {0x7d, 0x5e};
const std::vector<uint8_t> expect = {
0x7e, 0xff, 0x7d, 0x23, 0x7d, 0x20, 0x21, 0x7d, 0x5d, 0x5e, 0xc9, 0xb5, 0x7e,
};
const ppp::FrameView frame(ppp::Protocol::Ipv4, information);
const std::vector<uint8_t> raw_frame = ppp::SerializeFrame(frame);
ASSERT_EQ(raw_frame.size(), expect.size());
ASSERT_BYTES_EQ(raw_frame.data(), expect.data(), expect.size());
}
TEST(FrameTestCase, SerializeFrameEscapeAll) {
const std::vector<uint8_t> information = {0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d};
const std::vector<uint8_t> expect = {
0x7e, 0xff, 0x7d, 0x23, 0xc0, 0x25, 0x7d, 0x5e, 0x7d, 0x5e, 0x7d,
0x5e, 0x7d, 0x5d, 0x7d, 0x5d, 0x7d, 0x5d, 0x6c, 0x43, 0x7e,
};
const ppp::FrameView frame(ppp::Protocol::LinkQualityReport, information);
const std::vector<uint8_t> raw_frame = ppp::SerializeFrame(frame);
ASSERT_EQ(raw_frame.size(), expect.size());
ASSERT_BYTES_EQ(raw_frame.data(), expect.data(), expect.size());
}
TEST(FrameTestCase, DeserializeFrameEmpty) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0xff, 0x7d, 0x23, 0xc2, 0x23, 0xeb, 0x3c, 0x7e,
};
const std::vector<uint8_t> expect_information = {};
const ppp::Protocol expect_protocol = ppp::Protocol::ChallengeHandshakeAuthentication;
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_ok());
const auto frame = result.take_value();
ASSERT_EQ(frame.protocol, expect_protocol);
ASSERT_EQ(frame.information.size(), expect_information.size());
ASSERT_BYTES_EQ(frame.information.data(), expect_information.data(), expect_information.size());
}
TEST(FrameTestCase, DeserializeFrameNoEscape) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0xff, 0x7d, 0x23, 0xc0, 0x23, 0x89, 0xab, 0xde, 0x7d, 0x37, 0x7d, 0x2b, 0x7e,
};
const std::vector<uint8_t> expect_information = {0x89, 0xab, 0xde};
const ppp::Protocol expect_protocol = ppp::Protocol::PasswordAuthentication;
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_ok());
const auto frame = result.take_value();
ASSERT_EQ(frame.protocol, expect_protocol);
ASSERT_EQ(frame.information.size(), expect_information.size());
ASSERT_BYTES_EQ(frame.information.data(), expect_information.data(), expect_information.size());
}
TEST(FrameTestCase, DeserializeFrameEscapeFlagSequence) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0xff, 0x7d, 0x23, 0x80, 0x57, 0xaa, 0x7d, 0x5e, 0xaa, 0xe3, 0x7d, 0x3a, 0x7e,
};
const std::vector<uint8_t> expect_information = {0xaa, 0x7e, 0xaa};
const ppp::Protocol expect_protocol = ppp::Protocol::Ipv6Control;
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_ok());
const auto frame = result.take_value();
ASSERT_EQ(frame.protocol, expect_protocol);
ASSERT_EQ(frame.information.size(), expect_information.size());
ASSERT_BYTES_EQ(frame.information.data(), expect_information.data(), expect_information.size());
}
TEST(FrameTestCase, DeserializeFrameEscapeEscaped) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0xff, 0x7d, 0x23, 0x7d, 0x20, 0x21, 0x7d, 0x5d, 0x5e, 0xc9, 0xb5, 0x7e,
};
const std::vector<uint8_t> expect_information = {0x7d, 0x5e};
const ppp::Protocol expect_protocol = ppp::Protocol::Ipv4;
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_ok());
const auto frame = result.take_value();
ASSERT_EQ(frame.protocol, expect_protocol);
ASSERT_EQ(frame.information.size(), expect_information.size());
ASSERT_BYTES_EQ(frame.information.data(), expect_information.data(), expect_information.size());
}
TEST(FrameTestCase, DeserializeFrameEscapeAll) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0xff, 0x7d, 0x23, 0xc0, 0x25, 0x7d, 0x5e, 0x7d, 0x5e, 0x7d,
0x5e, 0x7d, 0x5d, 0x7d, 0x5d, 0x7d, 0x5d, 0x6c, 0x43, 0x7e,
};
const std::vector<uint8_t> expect_information = {0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d};
const ppp::Protocol expect_protocol = ppp::Protocol::LinkQualityReport;
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_ok());
const auto frame = result.take_value();
ASSERT_EQ(frame.protocol, expect_protocol);
ASSERT_EQ(frame.information.size(), expect_information.size());
ASSERT_BYTES_EQ(frame.information.data(), expect_information.data(), expect_information.size());
}
TEST(FrameTestCase, DeserializeFrameTooSmall) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0xff, 0x7d, 0x23, 0xc2, 0xeb, 0x3c, 0x7e,
};
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_error());
ASSERT_EQ(result.error(), ppp::DeserializationError::FormatInvalid);
}
TEST(FrameTestCase, DeserializeFrameMissingOpenFlag) {
const std::vector<uint8_t> raw_frame = {
0xff, 0x7d, 0x23, 0xc2, 0x23, 0xaa, 0xeb, 0x3c, 0x7e,
};
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_error());
ASSERT_EQ(result.error(), ppp::DeserializationError::FormatInvalid);
}
TEST(FrameTestCase, DeserializeFrameMissingCloseFlag) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0xff, 0x7d, 0x23, 0xc2, 0x23, 0xaa, 0xeb, 0x3c,
};
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_error());
ASSERT_EQ(result.error(), ppp::DeserializationError::FormatInvalid);
}
TEST(FrameTestCase, DeserializeFrameBadAddress) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0x7d, 0x20, 0x7d, 0x23, 0xc2, 0x23, 0xeb, 0x3c, 0x7e,
};
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_error());
ASSERT_EQ(result.error(), ppp::DeserializationError::UnrecognizedAddress);
}
TEST(FrameTestCase, DeserializeFrameBadControl) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0xff, 0x7d, 0x20, 0xc2, 0x23, 0xeb, 0x3c, 0x7e,
};
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_error());
ASSERT_EQ(result.error(), ppp::DeserializationError::UnrecognizedControl);
}
TEST(FrameTestCase, DeserializeFrameBadFrameCheckSequence) {
const std::vector<uint8_t> raw_frame = {
0x7e, 0xff, 0x7d, 0x23, 0xc2, 0x23, 0x7d, 0x20, 0x7d, 0x20, 0x7e,
};
auto result = ppp::DeserializeFrame(raw_frame);
ASSERT_TRUE(result.is_error());
ASSERT_EQ(result.error(), ppp::DeserializationError::FailedFrameCheckSequence);
}
} // namespace