blob: 298f21b775e52bc13f89291c988aa52b896fe520 [file] [log] [blame]
/** @file
*
* A brief file description
*
* @section license License
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "catch.hpp"
#include "quic/QUICAltConnectionManager.h"
#include "quic/QUICIntUtil.h"
#include <memory>
TEST_CASE("QUICPreferredAddress", "[quic]")
{
uint8_t buf[] = {
0x12, 0x34, 0x56, 0x78, // IPv4 address
0x23, 0x45, // IPv4 port
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // IPv6 address
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x34, 0x56, // IPv6 port
0x01, // ConnectionId length
0x55, // ConnectionId
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, // Stateless Reset Token
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
};
uint8_t cid_buf[] = {0x55};
QUICConnectionId cid55(cid_buf, sizeof(cid_buf));
in6_addr ipv6_addr;
memcpy(ipv6_addr.s6_addr, "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f", 16);
SECTION("load")
{
auto pref_addr = new QUICPreferredAddress(buf, sizeof(buf));
CHECK(pref_addr->is_available());
CHECK(pref_addr->has_ipv4());
CHECK(pref_addr->endpoint_ipv4().isIp4());
CHECK(pref_addr->endpoint_ipv4().host_order_port() == 0x2345);
CHECK(pref_addr->endpoint_ipv4().sin.sin_addr.s_addr == 0x78563412);
CHECK(pref_addr->has_ipv6());
CHECK(pref_addr->endpoint_ipv6().isIp6());
CHECK(pref_addr->endpoint_ipv6().host_order_port() == 0x3456);
CHECK(memcmp(pref_addr->endpoint_ipv6().sin6.sin6_addr.s6_addr, ipv6_addr.s6_addr, 16) == 0);
CHECK(pref_addr->cid() == cid55);
CHECK(memcmp(pref_addr->token().buf(), buf + 26, 16) == 0);
delete pref_addr;
}
SECTION("store")
{
IpEndpoint ep_ipv4;
ats_ip4_set(&ep_ipv4, 0x78563412, 0x4523);
IpEndpoint ep_ipv6;
ats_ip6_set(&ep_ipv6, ipv6_addr, 0x5634);
auto pref_addr = new QUICPreferredAddress(ep_ipv4, ep_ipv6, cid55, {buf + 26});
CHECK(pref_addr->is_available());
CHECK(pref_addr->has_ipv4());
CHECK(pref_addr->endpoint_ipv4().isIp4());
CHECK(pref_addr->endpoint_ipv4().host_order_port() == 0x2345);
CHECK(pref_addr->endpoint_ipv4().sin.sin_addr.s_addr == 0x78563412);
CHECK(pref_addr->has_ipv6());
CHECK(pref_addr->endpoint_ipv6().isIp6());
CHECK(pref_addr->endpoint_ipv6().host_order_port() == 0x3456);
CHECK(memcmp(pref_addr->endpoint_ipv6().sin6.sin6_addr.s6_addr, ipv6_addr.s6_addr, 16) == 0);
CHECK(pref_addr->cid() == cid55);
uint8_t actual[QUICPreferredAddress::MAX_LEN];
uint16_t len;
pref_addr->store(actual, len);
CHECK(sizeof(buf) == len);
CHECK(memcmp(buf, actual, sizeof(buf)) == 0);
delete pref_addr;
}
SECTION("unavailable")
{
auto pref_addr = new QUICPreferredAddress(nullptr, 0);
CHECK(!pref_addr->is_available());
CHECK(!pref_addr->has_ipv4());
CHECK(!pref_addr->has_ipv6());
delete pref_addr;
}
}