///|
pub(all) struct GeneratedVector {
name : String
parser : String
data : Bytes
expected_success : Bool
expected_error : String
expected_consumed : Int
expected_remaining_length : Int
expected_family : String
expected_transport : String
}
///|
pub const GENERATED_VECTOR_COUNT : Int = 71
///|
pub fn generated_vectors() -> Array[GeneratedVector] {
[
{
name: "v1-valid/tcp4",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x34', b'\x20', b'\x31', b'\x39', b'\x32', b'\x2e', b'\x30', b'\x2e', b'\x32',
b'\x2e', b'\x31', b'\x20', b'\x31', b'\x39', b'\x38', b'\x2e', b'\x35', b'\x31',
b'\x2e', b'\x31', b'\x30', b'\x30', b'\x2e', b'\x32', b'\x20', b'\x31', b'\x32',
b'\x33', b'\x34', b'\x20', b'\x34', b'\x34', b'\x33', b'\x0d', b'\x0a',
]),
expected_success: true,
expected_error: "",
expected_consumed: 44,
expected_remaining_length: 0,
expected_family: "Inet",
expected_transport: "Stream",
},
{
name: "v1-valid/tcp6-full",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x36', b'\x20', b'\x32', b'\x30', b'\x30', b'\x31', b'\x3a', b'\x64', b'\x62',
b'\x38', b'\x3a', b'\x30', b'\x3a', b'\x31', b'\x3a', b'\x32', b'\x3a', b'\x33',
b'\x3a', b'\x34', b'\x3a', b'\x35', b'\x20', b'\x32', b'\x30', b'\x30', b'\x31',
b'\x3a', b'\x64', b'\x62', b'\x38', b'\x3a', b'\x30', b'\x3a', b'\x36', b'\x3a',
b'\x37', b'\x3a', b'\x38', b'\x3a', b'\x39', b'\x3a', b'\x61', b'\x20', b'\x31',
b'\x32', b'\x33', b'\x34', b'\x20', b'\x34', b'\x34', b'\x33', b'\x0d', b'\x0a',
]),
expected_success: true,
expected_error: "",
expected_consumed: 63,
expected_remaining_length: 0,
expected_family: "Inet6",
expected_transport: "Stream",
},
{
name: "v1-valid/tcp6-compressed",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x36', b'\x20', b'\x32', b'\x30', b'\x30', b'\x31', b'\x3a', b'\x64', b'\x62',
b'\x38', b'\x3a', b'\x3a', b'\x31', b'\x20', b'\x32', b'\x30', b'\x30', b'\x31',
b'\x3a', b'\x64', b'\x62', b'\x38', b'\x3a', b'\x3a', b'\x32', b'\x20', b'\x31',
b'\x20', b'\x32', b'\x0d', b'\x0a',
]),
expected_success: true,
expected_error: "",
expected_consumed: 40,
expected_remaining_length: 0,
expected_family: "Inet6",
expected_transport: "Stream",
},
{
name: "v1-valid/unknown",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x55', b'\x4e', b'\x4b',
b'\x4e', b'\x4f', b'\x57', b'\x4e', b'\x0d', b'\x0a',
]),
expected_success: true,
expected_error: "",
expected_consumed: 15,
expected_remaining_length: 0,
expected_family: "Unspec",
expected_transport: "Unspec",
},
{
name: "v1-valid/unknown-extra",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x55', b'\x4e', b'\x4b',
b'\x4e', b'\x4f', b'\x57', b'\x4e', b'\x20', b'\x69', b'\x67', b'\x6e', b'\x6f',
b'\x72', b'\x65', b'\x64', b'\x20', b'\x66', b'\x69', b'\x65', b'\x6c', b'\x64',
b'\x73', b'\x0d', b'\x0a',
]),
expected_success: true,
expected_error: "",
expected_consumed: 30,
expected_remaining_length: 0,
expected_family: "Unspec",
expected_transport: "Unspec",
},
{
name: "v1-valid/port-bounds",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x34', b'\x20', b'\x30', b'\x2e', b'\x30', b'\x2e', b'\x30', b'\x2e', b'\x30',
b'\x20', b'\x32', b'\x35', b'\x35', b'\x2e', b'\x32', b'\x35', b'\x35', b'\x2e',
b'\x32', b'\x35', b'\x35', b'\x2e', b'\x32', b'\x35', b'\x35', b'\x20', b'\x30',
b'\x20', b'\x36', b'\x35', b'\x35', b'\x33', b'\x35', b'\x0d', b'\x0a',
]),
expected_success: true,
expected_error: "",
expected_consumed: 44,
expected_remaining_length: 0,
expected_family: "Inet",
expected_transport: "Stream",
},
{
name: "v1-valid/line-exactly-107",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x55', b'\x4e', b'\x4b',
b'\x4e', b'\x4f', b'\x57', b'\x4e', b'\x20', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x0d', b'\x0a',
]),
expected_success: true,
expected_error: "",
expected_consumed: 107,
expected_remaining_length: 0,
expected_family: "Unspec",
expected_transport: "Unspec",
},
{
name: "v1-valid/http-payload",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x34', b'\x20', b'\x31', b'\x39', b'\x32', b'\x2e', b'\x30', b'\x2e', b'\x32',
b'\x2e', b'\x31', b'\x20', b'\x31', b'\x39', b'\x38', b'\x2e', b'\x35', b'\x31',
b'\x2e', b'\x31', b'\x30', b'\x30', b'\x2e', b'\x32', b'\x20', b'\x31', b'\x32',
b'\x33', b'\x34', b'\x20', b'\x34', b'\x34', b'\x33', b'\x0d', b'\x0a', b'\x47',
b'\x45', b'\x54', b'\x20', b'\x2f', b'\x20', b'\x48', b'\x54', b'\x54', b'\x50',
b'\x2f', b'\x31', b'\x2e', b'\x31', b'\x0d', b'\x0a', b'\x0d', b'\x0a',
]),
expected_success: true,
expected_error: "",
expected_consumed: 44,
expected_remaining_length: 18,
expected_family: "Inet",
expected_transport: "Stream",
},
{
name: "v1-valid/binary-payload",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x55', b'\x4e', b'\x4b',
b'\x4e', b'\x4f', b'\x57', b'\x4e', b'\x0d', b'\x0a', b'\x00', b'\xff', b'\x16',
b'\x03', b'\x03',
]),
expected_success: true,
expected_error: "",
expected_consumed: 15,
expected_remaining_length: 5,
expected_family: "Unspec",
expected_transport: "Unspec",
},
{
name: "v1-invalid/single-lf",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x55', b'\x4e', b'\x4b',
b'\x4e', b'\x4f', b'\x57', b'\x4e', b'\x0a',
]),
expected_success: false,
expected_error: "MissingCrlf",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v1-invalid/single-cr",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x55', b'\x4e', b'\x4b',
b'\x4e', b'\x4f', b'\x57', b'\x4e', b'\x0d',
]),
expected_success: false,
expected_error: "NeedMoreData",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v1-invalid/bad-prefix",
parser: "v1",
data: Bytes::from_array([
b'\x70', b'\x72', b'\x6f', b'\x78', b'\x79', b'\x20', b'\x55', b'\x4e', b'\x4b',
b'\x4e', b'\x4f', b'\x57', b'\x4e', b'\x0d', b'\x0a',
]),
expected_success: false,
expected_error: "InvalidPrefix",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v1-invalid/port-high",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x34', b'\x20', b'\x31', b'\x2e', b'\x32', b'\x2e', b'\x33', b'\x2e', b'\x34',
b'\x20', b'\x35', b'\x2e', b'\x36', b'\x2e', b'\x37', b'\x2e', b'\x38', b'\x20',
b'\x36', b'\x35', b'\x35', b'\x33', b'\x36', b'\x20', b'\x31', b'\x0d', b'\x0a',
]),
expected_success: false,
expected_error: "InvalidPort",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v1-invalid/negative-port",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x34', b'\x20', b'\x31', b'\x2e', b'\x32', b'\x2e', b'\x33', b'\x2e', b'\x34',
b'\x20', b'\x35', b'\x2e', b'\x36', b'\x2e', b'\x37', b'\x2e', b'\x38', b'\x20',
b'\x2d', b'\x31', b'\x20', b'\x31', b'\x0d', b'\x0a',
]),
expected_success: false,
expected_error: "InvalidPort",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v1-invalid/plus-port",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x34', b'\x20', b'\x31', b'\x2e', b'\x32', b'\x2e', b'\x33', b'\x2e', b'\x34',
b'\x20', b'\x35', b'\x2e', b'\x36', b'\x2e', b'\x37', b'\x2e', b'\x38', b'\x20',
b'\x2b', b'\x31', b'\x20', b'\x31', b'\x0d', b'\x0a',
]),
expected_success: false,
expected_error: "InvalidPort",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v1-invalid/bad-ipv4",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x34', b'\x20', b'\x32', b'\x35', b'\x36', b'\x2e', b'\x32', b'\x2e', b'\x33',
b'\x2e', b'\x34', b'\x20', b'\x35', b'\x2e', b'\x36', b'\x2e', b'\x37', b'\x2e',
b'\x38', b'\x20', b'\x31', b'\x20', b'\x32', b'\x0d', b'\x0a',
]),
expected_success: false,
expected_error: "InvalidIpv4",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v1-invalid/bad-ipv6",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x36', b'\x20', b'\x32', b'\x30', b'\x30', b'\x31', b'\x3a', b'\x3a', b'\x31',
b'\x3a', b'\x3a', b'\x32', b'\x20', b'\x32', b'\x30', b'\x30', b'\x31', b'\x3a',
b'\x64', b'\x62', b'\x38', b'\x3a', b'\x3a', b'\x32', b'\x20', b'\x31', b'\x20',
b'\x32', b'\x0d', b'\x0a',
]),
expected_success: false,
expected_error: "InvalidIpv6",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v1-invalid/double-space",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x20', b'\x54', b'\x43',
b'\x50', b'\x34', b'\x20', b'\x31', b'\x2e', b'\x32', b'\x2e', b'\x33', b'\x2e',
b'\x34', b'\x20', b'\x35', b'\x2e', b'\x36', b'\x2e', b'\x37', b'\x2e', b'\x38',
b'\x20', b'\x31', b'\x20', b'\x32', b'\x0d', b'\x0a',
]),
expected_success: false,
expected_error: "InvalidV1Line",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v1-invalid/line-too-long",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x55', b'\x4e', b'\x4b',
b'\x4e', b'\x4f', b'\x57', b'\x4e', b'\x20', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78',
b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x78', b'\x0d', b'\x0a',
]),
expected_success: false,
expected_error: "V1LineTooLong",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-valid/local",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x20', b'\x00', b'\x00', b'\x00',
]),
expected_success: true,
expected_error: "",
expected_consumed: 16,
expected_remaining_length: 0,
expected_family: "Unspec",
expected_transport: "Unspec",
},
{
name: "v2-valid/local-body",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x20', b'\x00', b'\x00', b'\x07', b'\x69', b'\x67',
b'\x6e', b'\x6f', b'\x72', b'\x65', b'\x64',
]),
expected_success: true,
expected_error: "",
expected_consumed: 23,
expected_remaining_length: 0,
expected_family: "Unspec",
expected_transport: "Unspec",
},
{
name: "v2-valid/local-reserved",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x20', b'\xff', b'\x00', b'\x00',
]),
expected_success: true,
expected_error: "",
expected_consumed: 16,
expected_remaining_length: 0,
expected_family: "Unspec",
expected_transport: "Unspec",
},
{
name: "v2-valid/local-reserved-body-payload",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x20', b'\xff', b'\x00', b'\x07', b'\x69', b'\x67',
b'\x6e', b'\x6f', b'\x72', b'\x65', b'\x64', b'\x50', b'\x41', b'\x59',
]),
expected_success: true,
expected_error: "",
expected_consumed: 23,
expected_remaining_length: 3,
expected_family: "Unspec",
expected_transport: "Unspec",
},
{
name: "v2-valid/unspec",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x00', b'\x00', b'\x00',
]),
expected_success: true,
expected_error: "",
expected_consumed: 16,
expected_remaining_length: 0,
expected_family: "Unspec",
expected_transport: "Unspec",
},
{
name: "v2-valid/tcp4",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x0c', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x04', b'\xd2', b'\x01',
b'\xbb',
]),
expected_success: true,
expected_error: "",
expected_consumed: 28,
expected_remaining_length: 0,
expected_family: "Inet",
expected_transport: "Stream",
},
{
name: "v2-valid/udp4",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x12', b'\x00', b'\x0c', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x00', b'\x35', b'\x14',
b'\xe9',
]),
expected_success: true,
expected_error: "",
expected_consumed: 28,
expected_remaining_length: 0,
expected_family: "Inet",
expected_transport: "Datagram",
},
{
name: "v2-valid/tcp6",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x21', b'\x00', b'\x24', b'\x20', b'\x01',
b'\x0d', b'\xb8', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x01', b'\x20', b'\x01', b'\x0d', b'\xb8',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x02', b'\x04', b'\xd2', b'\x01', b'\xbb',
]),
expected_success: true,
expected_error: "",
expected_consumed: 52,
expected_remaining_length: 0,
expected_family: "Inet6",
expected_transport: "Stream",
},
{
name: "v2-valid/udp6",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x22', b'\x00', b'\x24', b'\x20', b'\x01',
b'\x0d', b'\xb8', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x01', b'\x20', b'\x01', b'\x0d', b'\xb8',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x02', b'\x00', b'\x35', b'\x14', b'\xe9',
]),
expected_success: true,
expected_error: "",
expected_consumed: 52,
expected_remaining_length: 0,
expected_family: "Inet6",
expected_transport: "Datagram",
},
{
name: "v2-valid/unix-stream",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x31', b'\x00', b'\xd8', b'\x00', b'\x01',
b'\x02', b'\x03', b'\x04', b'\x05', b'\x06', b'\x07', b'\x08', b'\x09', b'\x0a',
b'\x0b', b'\x0c', b'\x0d', b'\x0e', b'\x0f', b'\x10', b'\x11', b'\x12', b'\x13',
b'\x14', b'\x15', b'\x16', b'\x17', b'\x18', b'\x19', b'\x1a', b'\x1b', b'\x1c',
b'\x1d', b'\x1e', b'\x1f', b'\x20', b'\x21', b'\x22', b'\x23', b'\x24', b'\x25',
b'\x26', b'\x27', b'\x28', b'\x29', b'\x2a', b'\x2b', b'\x2c', b'\x2d', b'\x2e',
b'\x2f', b'\x30', b'\x31', b'\x32', b'\x33', b'\x34', b'\x35', b'\x36', b'\x37',
b'\x38', b'\x39', b'\x3a', b'\x3b', b'\x3c', b'\x3d', b'\x3e', b'\x3f', b'\x40',
b'\x41', b'\x42', b'\x43', b'\x44', b'\x45', b'\x46', b'\x47', b'\x48', b'\x49',
b'\x4a', b'\x4b', b'\x4c', b'\x4d', b'\x4e', b'\x4f', b'\x50', b'\x51', b'\x52',
b'\x53', b'\x54', b'\x55', b'\x56', b'\x57', b'\x58', b'\x59', b'\x5a', b'\x5b',
b'\x5c', b'\x5d', b'\x5e', b'\x5f', b'\x60', b'\x61', b'\x62', b'\x63', b'\x64',
b'\x65', b'\x66', b'\x67', b'\x68', b'\x69', b'\x6a', b'\x6b', b'\x6b', b'\x6a',
b'\x69', b'\x68', b'\x67', b'\x66', b'\x65', b'\x64', b'\x63', b'\x62', b'\x61',
b'\x60', b'\x5f', b'\x5e', b'\x5d', b'\x5c', b'\x5b', b'\x5a', b'\x59', b'\x58',
b'\x57', b'\x56', b'\x55', b'\x54', b'\x53', b'\x52', b'\x51', b'\x50', b'\x4f',
b'\x4e', b'\x4d', b'\x4c', b'\x4b', b'\x4a', b'\x49', b'\x48', b'\x47', b'\x46',
b'\x45', b'\x44', b'\x43', b'\x42', b'\x41', b'\x40', b'\x3f', b'\x3e', b'\x3d',
b'\x3c', b'\x3b', b'\x3a', b'\x39', b'\x38', b'\x37', b'\x36', b'\x35', b'\x34',
b'\x33', b'\x32', b'\x31', b'\x30', b'\x2f', b'\x2e', b'\x2d', b'\x2c', b'\x2b',
b'\x2a', b'\x29', b'\x28', b'\x27', b'\x26', b'\x25', b'\x24', b'\x23', b'\x22',
b'\x21', b'\x20', b'\x1f', b'\x1e', b'\x1d', b'\x1c', b'\x1b', b'\x1a', b'\x19',
b'\x18', b'\x17', b'\x16', b'\x15', b'\x14', b'\x13', b'\x12', b'\x11', b'\x10',
b'\x0f', b'\x0e', b'\x0d', b'\x0c', b'\x0b', b'\x0a', b'\x09', b'\x08', b'\x07',
b'\x06', b'\x05', b'\x04', b'\x03', b'\x02', b'\x01', b'\x00',
]),
expected_success: true,
expected_error: "",
expected_consumed: 232,
expected_remaining_length: 0,
expected_family: "Unix",
expected_transport: "Stream",
},
{
name: "v2-valid/unix-dgram",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x32', b'\x00', b'\xd8', b'\x00', b'\x01',
b'\x02', b'\x03', b'\x04', b'\x05', b'\x06', b'\x07', b'\x08', b'\x09', b'\x0a',
b'\x0b', b'\x0c', b'\x0d', b'\x0e', b'\x0f', b'\x10', b'\x11', b'\x12', b'\x13',
b'\x14', b'\x15', b'\x16', b'\x17', b'\x18', b'\x19', b'\x1a', b'\x1b', b'\x1c',
b'\x1d', b'\x1e', b'\x1f', b'\x20', b'\x21', b'\x22', b'\x23', b'\x24', b'\x25',
b'\x26', b'\x27', b'\x28', b'\x29', b'\x2a', b'\x2b', b'\x2c', b'\x2d', b'\x2e',
b'\x2f', b'\x30', b'\x31', b'\x32', b'\x33', b'\x34', b'\x35', b'\x36', b'\x37',
b'\x38', b'\x39', b'\x3a', b'\x3b', b'\x3c', b'\x3d', b'\x3e', b'\x3f', b'\x40',
b'\x41', b'\x42', b'\x43', b'\x44', b'\x45', b'\x46', b'\x47', b'\x48', b'\x49',
b'\x4a', b'\x4b', b'\x4c', b'\x4d', b'\x4e', b'\x4f', b'\x50', b'\x51', b'\x52',
b'\x53', b'\x54', b'\x55', b'\x56', b'\x57', b'\x58', b'\x59', b'\x5a', b'\x5b',
b'\x5c', b'\x5d', b'\x5e', b'\x5f', b'\x60', b'\x61', b'\x62', b'\x63', b'\x64',
b'\x65', b'\x66', b'\x67', b'\x68', b'\x69', b'\x6a', b'\x6b', b'\x6b', b'\x6a',
b'\x69', b'\x68', b'\x67', b'\x66', b'\x65', b'\x64', b'\x63', b'\x62', b'\x61',
b'\x60', b'\x5f', b'\x5e', b'\x5d', b'\x5c', b'\x5b', b'\x5a', b'\x59', b'\x58',
b'\x57', b'\x56', b'\x55', b'\x54', b'\x53', b'\x52', b'\x51', b'\x50', b'\x4f',
b'\x4e', b'\x4d', b'\x4c', b'\x4b', b'\x4a', b'\x49', b'\x48', b'\x47', b'\x46',
b'\x45', b'\x44', b'\x43', b'\x42', b'\x41', b'\x40', b'\x3f', b'\x3e', b'\x3d',
b'\x3c', b'\x3b', b'\x3a', b'\x39', b'\x38', b'\x37', b'\x36', b'\x35', b'\x34',
b'\x33', b'\x32', b'\x31', b'\x30', b'\x2f', b'\x2e', b'\x2d', b'\x2c', b'\x2b',
b'\x2a', b'\x29', b'\x28', b'\x27', b'\x26', b'\x25', b'\x24', b'\x23', b'\x22',
b'\x21', b'\x20', b'\x1f', b'\x1e', b'\x1d', b'\x1c', b'\x1b', b'\x1a', b'\x19',
b'\x18', b'\x17', b'\x16', b'\x15', b'\x14', b'\x13', b'\x12', b'\x11', b'\x10',
b'\x0f', b'\x0e', b'\x0d', b'\x0c', b'\x0b', b'\x0a', b'\x09', b'\x08', b'\x07',
b'\x06', b'\x05', b'\x04', b'\x03', b'\x02', b'\x01', b'\x00',
]),
expected_success: true,
expected_error: "",
expected_consumed: 232,
expected_remaining_length: 0,
expected_family: "Unix",
expected_transport: "Datagram",
},
{
name: "v2-valid/multiple-tlvs",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x15', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x04', b'\xd2', b'\x01',
b'\xbb', b'\x01', b'\x00', b'\x02', b'\x68', b'\x32', b'\x04', b'\x00', b'\x01',
b'\x78',
]),
expected_success: true,
expected_error: "",
expected_consumed: 37,
expected_remaining_length: 0,
expected_family: "Inet",
expected_transport: "Stream",
},
{
name: "v2-invalid/signature",
parser: "v2",
data: Bytes::from_array([
b'\x58', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x20', b'\x00', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidV2Signature",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/version",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x10', b'\x00', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "UnsupportedVersion",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/command",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x22', b'\x00', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidCommand",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/family",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x41', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidFamily",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/transport",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x03', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidTransport",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/family-transport",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x10', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidFamilyTransport",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/unspec-stream",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x01', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidFamilyTransport",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/unspec-dgram",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x02', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidFamilyTransport",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/inet-unspec",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x10', b'\x00', b'\x0c', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00',
]),
expected_success: false,
expected_error: "InvalidFamilyTransport",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/inet6-unspec",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x20', b'\x00', b'\x24', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidFamilyTransport",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/unix-unspec",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x30', b'\x00', b'\xd8', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidFamilyTransport",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/fixed-truncated",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00',
]),
expected_success: false,
expected_error: "NeedMoreData",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/ipv4-truncated",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x0b', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "TruncatedAddress",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/declared-over-input",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x0d', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x04', b'\xd2', b'\x01',
b'\xbb',
]),
expected_success: false,
expected_error: "NeedMoreData",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "v2-invalid/tlv-value-truncated",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x11', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x04', b'\xd2', b'\x01',
b'\xbb', b'\x90', b'\x00', b'\x05', b'\x61', b'\x62',
]),
expected_success: false,
expected_error: "TruncatedTlv",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/alpn",
parser: "typed_tlv",
data: Bytes::from_array([b'\x01', b'\x00', b'\x02', b'\x68', b'\x32']),
expected_success: true,
expected_error: "",
expected_consumed: 5,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/authority",
parser: "typed_tlv",
data: Bytes::from_array([
b'\x02', b'\x00', b'\x0c', b'\x65', b'\x78', b'\x61', b'\x6d', b'\x70', b'\x6c',
b'\x65', b'\x2e', b'\x74', b'\x65', b'\x73', b'\x74',
]),
expected_success: true,
expected_error: "",
expected_consumed: 15,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/noop-empty",
parser: "typed_tlv",
data: Bytes::from_array([b'\x04', b'\x00', b'\x00']),
expected_success: true,
expected_error: "",
expected_consumed: 3,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/unique-id",
parser: "typed_tlv",
data: Bytes::from_array([
b'\x05', b'\x00', b'\x06', b'\x69', b'\x64', b'\x2d', b'\x31', b'\x32', b'\x33',
]),
expected_success: true,
expected_error: "",
expected_consumed: 9,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/unknown",
parser: "typed_tlv",
data: Bytes::from_array([b'\x90', b'\x00', b'\x02', b'\x41', b'\x42']),
expected_success: true,
expected_error: "",
expected_consumed: 5,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/netns",
parser: "typed_tlv",
data: Bytes::from_array([
b'\x30', b'\x00', b'\x04', b'\x62', b'\x6c', b'\x75', b'\x65',
]),
expected_success: true,
expected_error: "",
expected_consumed: 7,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/authority-invalid-utf8",
parser: "typed_tlv",
data: Bytes::from_array([b'\x02', b'\x00', b'\x01', b'\xff']),
expected_success: false,
expected_error: "InvalidTlv",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/unique-id-too-long",
parser: "typed_tlv",
data: Bytes::from_array([
b'\x05', b'\x00', b'\x81', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
b'\x75', b'\x75', b'\x75', b'\x75', b'\x75', b'\x75',
]),
expected_success: false,
expected_error: "InvalidTlv",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/netns-non-ascii",
parser: "typed_tlv",
data: Bytes::from_array([b'\x30', b'\x00', b'\x01', b'\x80']),
expected_success: false,
expected_error: "InvalidTlv",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "tlv/crc-length-three",
parser: "typed_tlv",
data: Bytes::from_array([
b'\x03', b'\x00', b'\x03', b'\x00', b'\x00', b'\x00',
]),
expected_success: false,
expected_error: "InvalidTlv",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "ssl-tlv/fixed",
parser: "typed_tlv",
data: Bytes::from_array([
b'\x20', b'\x00', b'\x05', b'\x01', b'\x00', b'\x00', b'\x00', b'\x00',
]),
expected_success: true,
expected_error: "",
expected_consumed: 8,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "ssl-tlv/version",
parser: "typed_tlv",
data: Bytes::from_array([
b'\x20', b'\x00', b'\x0f', b'\x01', b'\x00', b'\x00', b'\x00', b'\x00', b'\x21',
b'\x00', b'\x07', b'\x54', b'\x4c', b'\x53', b'\x76', b'\x31', b'\x2e', b'\x33',
]),
expected_success: true,
expected_error: "",
expected_consumed: 18,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "ssl-tlv/client-cert",
parser: "typed_tlv",
data: Bytes::from_array([
b'\x20', b'\x00', b'\x0d', b'\x03', b'\x00', b'\x00', b'\x00', b'\x00', b'\x28',
b'\x00', b'\x05', b'\x30', b'\x03', b'\x02', b'\x01', b'\x01',
]),
expected_success: true,
expected_error: "",
expected_consumed: 16,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "crc32c/ipv4-valid",
parser: "crc32c",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x13', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x04', b'\xd2', b'\x01',
b'\xbb', b'\x03', b'\x00', b'\x04', b'\x3f', b'\x39', b'\x34', b'\x85',
]),
expected_success: true,
expected_error: "",
expected_consumed: 35,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "crc32c/ipv6-valid",
parser: "crc32c",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x21', b'\x00', b'\x2b', b'\x20', b'\x01',
b'\x0d', b'\xb8', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x01', b'\x20', b'\x01', b'\x0d', b'\xb8',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x02', b'\x04', b'\xd2', b'\x01', b'\xbb', b'\x03', b'\x00',
b'\x04', b'\x8a', b'\x66', b'\xd8', b'\xf6',
]),
expected_success: true,
expected_error: "",
expected_consumed: 59,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "crc32c/multiple-tlv-valid",
parser: "crc32c",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x19', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x04', b'\xd2', b'\x01',
b'\xbb', b'\x04', b'\x00', b'\x03', b'\x61', b'\x62', b'\x63', b'\x03', b'\x00',
b'\x04', b'\x4b', b'\x2b', b'\xd4', b'\xa2',
]),
expected_success: true,
expected_error: "",
expected_consumed: 41,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "crc32c/tampered",
parser: "crc32c",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x13', b'\xc1', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x04', b'\xd2', b'\x01',
b'\xbb', b'\x03', b'\x00', b'\x04', b'\x3f', b'\x39', b'\x34', b'\x85',
]),
expected_success: false,
expected_error: "Crc32cMismatch",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "crc32c/missing",
parser: "crc32c",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x0c', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x04', b'\xd2', b'\x01',
b'\xbb',
]),
expected_success: false,
expected_error: "MissingCrc32c",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "crc32c/empty",
parser: "crc32c",
data: Bytes::from_array([]),
expected_success: false,
expected_error: "NeedMoreData",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
{
name: "payload/v1-http",
parser: "v1",
data: Bytes::from_array([
b'\x50', b'\x52', b'\x4f', b'\x58', b'\x59', b'\x20', b'\x54', b'\x43', b'\x50',
b'\x34', b'\x20', b'\x31', b'\x39', b'\x32', b'\x2e', b'\x30', b'\x2e', b'\x32',
b'\x2e', b'\x31', b'\x20', b'\x31', b'\x39', b'\x38', b'\x2e', b'\x35', b'\x31',
b'\x2e', b'\x31', b'\x30', b'\x30', b'\x2e', b'\x32', b'\x20', b'\x31', b'\x32',
b'\x33', b'\x34', b'\x20', b'\x34', b'\x34', b'\x33', b'\x0d', b'\x0a', b'\x47',
b'\x45', b'\x54', b'\x20', b'\x2f', b'\x20', b'\x48', b'\x54', b'\x54', b'\x50',
b'\x2f', b'\x31', b'\x2e', b'\x31', b'\x0d', b'\x0a', b'\x0d', b'\x0a',
]),
expected_success: true,
expected_error: "",
expected_consumed: 44,
expected_remaining_length: 18,
expected_family: "Inet",
expected_transport: "Stream",
},
{
name: "payload/v2-tls",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x11', b'\x00', b'\x0c', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x04', b'\xd2', b'\x01',
b'\xbb', b'\x16', b'\x03', b'\x03', b'\x00', b'\x05', b'\x68', b'\x65', b'\x6c',
b'\x6c', b'\x6f',
]),
expected_success: true,
expected_error: "",
expected_consumed: 28,
expected_remaining_length: 10,
expected_family: "Inet",
expected_transport: "Stream",
},
{
name: "payload/v2-binary",
parser: "v2",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x21', b'\x00', b'\x24', b'\x20', b'\x01',
b'\x0d', b'\xb8', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x01', b'\x20', b'\x01', b'\x0d', b'\xb8',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x02', b'\x04', b'\xd2', b'\x01', b'\xbb', b'\x00', b'\xff',
b'\x16', b'\x03', b'\x03',
]),
expected_success: true,
expected_error: "",
expected_consumed: 52,
expected_remaining_length: 5,
expected_family: "Inet6",
expected_transport: "Stream",
},
{
name: "datagram/udp4",
parser: "datagram",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x12', b'\x00', b'\x0c', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x00', b'\x35', b'\x14',
b'\xe9', b'\x64', b'\x6e', b'\x73',
]),
expected_success: true,
expected_error: "",
expected_consumed: 28,
expected_remaining_length: 3,
expected_family: "Inet",
expected_transport: "Datagram",
},
{
name: "datagram/udp6",
parser: "datagram",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x22', b'\x00', b'\x24', b'\x20', b'\x01',
b'\x0d', b'\xb8', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x01', b'\x20', b'\x01', b'\x0d', b'\xb8',
b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00',
b'\x00', b'\x00', b'\x02', b'\x00', b'\x35', b'\x14', b'\xe9', b'\x64', b'\x6e',
b'\x73', b'\x36',
]),
expected_success: true,
expected_error: "",
expected_consumed: 52,
expected_remaining_length: 4,
expected_family: "Inet6",
expected_transport: "Datagram",
},
{
name: "datagram/truncated",
parser: "datagram",
data: Bytes::from_array([
b'\x0d', b'\x0a', b'\x0d', b'\x0a', b'\x00', b'\x0d', b'\x0a', b'\x51', b'\x55',
b'\x49', b'\x54', b'\x0a', b'\x21', b'\x12', b'\x00', b'\x0c', b'\xc0', b'\x00',
b'\x02', b'\x01', b'\xc6', b'\x33', b'\x64', b'\x02', b'\x00', b'\x35', b'\x14',
]),
expected_success: false,
expected_error: "InvalidLength",
expected_consumed: 0,
expected_remaining_length: 0,
expected_family: "",
expected_transport: "",
},
]
}
///|
fn generated_error_name(kind : ProxyErrorKind) -> String {
match kind {
NeedMoreData => "NeedMoreData"
InvalidPrefix => "InvalidPrefix"
UnsupportedVersion => "UnsupportedVersion"
InvalidCommand => "InvalidCommand"
InvalidFamily => "InvalidFamily"
InvalidTransport => "InvalidTransport"
InvalidFamilyTransport => "InvalidFamilyTransport"
InvalidV1Line => "InvalidV1Line"
V1LineTooLong => "V1LineTooLong"
MissingCrlf => "MissingCrlf"
InvalidIpv4 => "InvalidIpv4"
InvalidIpv6 => "InvalidIpv6"
InvalidPort => "InvalidPort"
InvalidV2Signature => "InvalidV2Signature"
InvalidLength => "InvalidLength"
HeaderTooLarge => "HeaderTooLarge"
TruncatedAddress => "TruncatedAddress"
TruncatedTlv => "TruncatedTlv"
InvalidTlv => "InvalidTlv"
DuplicateCrc32c => "DuplicateCrc32c"
MissingCrc32c => "MissingCrc32c"
Crc32cMismatch => "Crc32cMismatch"
InvalidSslTlv => "InvalidSslTlv"
PolicyViolation => "PolicyViolation"
DecoderAlreadyFinished => "DecoderAlreadyFinished"
DecoderFailed => "DecoderFailed"
}
}
///|
fn generated_family_name(family : AddressFamily) -> String {
match family {
Unspec => "Unspec"
Inet => "Inet"
Inet6 => "Inet6"
Unix => "Unix"
}
}
///|
fn generated_transport_name(transport : Transport) -> String {
match transport {
Unspec => "Unspec"
Stream => "Stream"
Datagram => "Datagram"
}
}
///|
fn generated_mismatch(
vector : GeneratedVector,
reason : String,
) -> Result[Unit, ProxyError] {
Err(proxy_error(PolicyViolation, 0, "vector \{vector.name}: \{reason}"))
}
///|
fn verify_generated_frame(
vector : GeneratedVector,
result : Result[DecodedFrame, ProxyError],
) -> Result[Unit, ProxyError] {
match result {
Err(error) =>
if vector.expected_success {
generated_mismatch(
vector,
"unexpected error \{generated_error_name(error.kind)}",
)
} else if generated_error_name(error.kind) != vector.expected_error {
generated_mismatch(
vector,
"wrong error \{generated_error_name(error.kind)}",
)
} else {
Ok(())
}
Ok(frame) =>
if !vector.expected_success {
generated_mismatch(vector, "unexpected success")
} else if frame.consumed != vector.expected_consumed {
generated_mismatch(vector, "consumed byte count differs")
} else if frame.remaining.length() != vector.expected_remaining_length {
generated_mismatch(vector, "remaining byte count differs")
} else if generated_family_name(frame.header.family) !=
vector.expected_family {
generated_mismatch(vector, "family differs")
} else if generated_transport_name(frame.header.transport) !=
vector.expected_transport {
generated_mismatch(vector, "transport differs")
} else {
Ok(())
}
}
}
///|
fn verify_generated_non_frame(
vector : GeneratedVector,
actual_success : Bool,
actual_error : String,
) -> Result[Unit, ProxyError] {
if actual_success != vector.expected_success {
generated_mismatch(vector, "success status differs")
} else if !actual_success && actual_error != vector.expected_error {
generated_mismatch(vector, "wrong error \{actual_error}")
} else {
Ok(())
}
}
///|
fn verify_one_generated_vector(
vector : GeneratedVector,
) -> Result[Unit, ProxyError] {
if vector.parser == "v1" {
verify_generated_frame(
vector,
decode_v1(vector.data, DecodePolicy::v1_only()),
)
} else if vector.parser == "v2" {
verify_generated_frame(
vector,
decode_v2(vector.data, DecodePolicy::v2_only()),
)
} else if vector.parser == "datagram" {
verify_generated_frame(
vector,
decode_datagram(vector.data, DecodePolicy::v2_only()),
)
} else if vector.parser == "crc32c" {
match verify_proxy_crc32c(vector.data) {
Ok(_) => verify_generated_non_frame(vector, true, "")
Err(error) =>
verify_generated_non_frame(
vector,
false,
generated_error_name(error.kind),
)
}
} else {
match parse_tlvs(vector.data) {
Err(error) =>
verify_generated_non_frame(
vector,
false,
generated_error_name(error.kind),
)
Ok(tlvs) =>
match interpret_all_tlvs(tlvs) {
Ok(_) => verify_generated_non_frame(vector, true, "")
Err(error) =>
verify_generated_non_frame(
vector,
false,
generated_error_name(error.kind),
)
}
}
}
}
///|
pub fn verify_generated_vectors() -> Result[Int, ProxyError] {
let vectors = generated_vectors()
for vector in vectors {
match verify_one_generated_vector(vector) {
Err(error) => return Err(error)
Ok(_) => ()
}
}
Ok(vectors.length())
}