///|
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())
}