#[cfg(test)]
mod transport_parameter_error_tests {
use crate::TransportError;
use crate::VarInt;
use crate::coding::BufMutExt;
use crate::transport_parameters::{Error, Side, TransportParameters};
#[test]
fn test_transport_parameter_error_from_malformed() {
let err = TransportError::from(Error::Malformed);
assert_eq!(
err.code,
crate::transport_error::Code::TRANSPORT_PARAMETER_ERROR
);
assert_eq!(err.reason, "malformed");
}
#[test]
fn test_transport_parameter_error_from_illegal_value() {
let err = TransportError::from(Error::IllegalValue);
assert_eq!(
err.code,
crate::transport_error::Code::TRANSPORT_PARAMETER_ERROR
);
assert_eq!(err.reason, "illegal value");
}
#[test]
fn test_ack_delay_exponent_validation() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x0a); buf.write_var_or_debug_assert(1); buf.push(21);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
if let Err(e) = result {
assert_eq!(e, Error::IllegalValue);
}
}
#[test]
fn test_max_ack_delay_validation() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x0b); let invalid_delay = 1u64 << 14; buf.write_var_or_debug_assert(VarInt::from_u64(invalid_delay).unwrap().size() as u64); buf.write_var_or_debug_assert(invalid_delay);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
if let Err(e) = result {
assert_eq!(e, Error::IllegalValue);
}
}
#[test]
fn test_active_connection_id_limit_validation() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x0e); buf.write_var_or_debug_assert(1); buf.write_var_or_debug_assert(1);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
if let Err(e) = result {
assert_eq!(e, Error::IllegalValue);
}
}
#[test]
fn test_max_udp_payload_size_validation() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x03); buf.write_var_or_debug_assert(2); buf.write_var_or_debug_assert(1199);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
if let Err(e) = result {
assert_eq!(e, Error::IllegalValue);
}
}
#[test]
fn test_min_ack_delay_validation() {
let mut params = TransportParameters::default();
params.max_ack_delay = VarInt::from_u32(25);
let mut buf = Vec::new();
params.write(&mut buf).unwrap();
buf.write_var_or_debug_assert(0xFF04DE1B); buf.write_var_or_debug_assert(4); buf.write_var_or_debug_assert(26000);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
if let Err(e) = result {
assert_eq!(e, Error::IllegalValue);
}
}
#[test]
fn test_write_order_invalid_index_returns_internal() {
let mut params = TransportParameters::default();
let mut order = std::array::from_fn(|i| i as u8);
order[0] = u8::MAX;
params.write_order = Some(order);
let mut buf = Vec::new();
let result = params.write(&mut buf);
assert_eq!(result, Err(Error::Internal));
}
#[test]
fn test_preferred_address_server_only() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x0d); buf.write_var_or_debug_assert(49);
buf.extend_from_slice(&[127, 0, 0, 1]); buf.extend_from_slice(&[0x1f, 0x90]); buf.extend_from_slice(&[0; 16]); buf.extend_from_slice(&[0x1f, 0x90]); buf.push(8); buf.extend_from_slice(&[1, 2, 3, 4, 5, 6, 7, 8]); buf.extend_from_slice(&[0; 16]);
let result = TransportParameters::read(Side::Server, &mut buf.as_slice());
assert!(result.is_err());
if let Err(e) = result {
assert_eq!(e, Error::IllegalValue);
}
}
#[test]
fn test_duplicate_parameter_error() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x01); buf.write_var_or_debug_assert(2); buf.write_var_or_debug_assert(30000);
buf.write_var_or_debug_assert(0x01); buf.write_var_or_debug_assert(2); buf.write_var_or_debug_assert(60000);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
if let Err(e) = result {
assert_eq!(e, Error::Malformed);
}
}
#[test]
fn test_malformed_varint_parameter() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x01); buf.write_var_or_debug_assert(5); buf.push(0xc0);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
}
#[test]
fn test_nat_traversal_concurrency_limit_validation() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x3d7e9f0bca12fea6); buf.write_var_or_debug_assert(1); buf.push(0);
let result = TransportParameters::read(Side::Server, &mut buf.as_slice());
assert!(result.is_err());
if let Err(e) = result {
assert_eq!(e, Error::IllegalValue);
}
let mut params = TransportParameters::default();
params.nat_traversal = Some(
crate::transport_parameters::NatTraversalConfig::ServerSupport {
concurrency_limit: VarInt::from_u32(101),
},
);
let mut buf = Vec::new();
params.write(&mut buf).unwrap();
let result = TransportParameters::read(Side::Server, &mut buf.as_slice());
assert!(result.is_err());
if let Err(e) = result {
assert_eq!(e, Error::IllegalValue);
}
}
#[test]
fn test_transport_error_code_value() {
let err = TransportError {
code: crate::transport_error::Code::TRANSPORT_PARAMETER_ERROR,
frame: None,
reason: "test".into(),
};
assert_eq!(u64::from(err.code), 0x08);
}
#[test]
fn test_transport_parameter_error_messages() {
let test_cases = vec![
"malformed",
"illegal value",
"missing mandatory parameter",
"forbidden parameter present",
"invalid parameter length",
"CID authentication failure",
"concurrency_limit must be greater than 0",
"concurrency_limit must not exceed 100",
];
for msg in test_cases {
let err = TransportError {
code: crate::transport_error::Code::TRANSPORT_PARAMETER_ERROR,
frame: None,
reason: msg.into(),
};
assert_eq!(
err.code,
crate::transport_error::Code::TRANSPORT_PARAMETER_ERROR
);
assert_eq!(err.reason, msg);
}
}
#[test]
fn test_parameter_length_mismatch() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x00); buf.write_var_or_debug_assert(5); buf.extend_from_slice(&[1, 2, 3]);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
}
#[test]
fn test_unknown_parameters_ignored() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x01); buf.write_var_or_debug_assert(VarInt::from_u32(30000).size() as u64); buf.write_var_or_debug_assert(30000);
buf.write_var_or_debug_assert(0xffffff); buf.write_var_or_debug_assert(4); buf.extend_from_slice(&[1, 2, 3, 4]);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
if let Err(e) = &result {
panic!("Expected unknown parameters to be ignored, but got error: {e:?}");
}
assert!(result.is_ok());
let params = result.unwrap();
assert_eq!(params.max_idle_timeout, VarInt::from_u32(30000));
}
}