#[cfg(test)]
mod transport_parameter_error_integration_tests {
use crate::TransportError;
use crate::VarInt;
use crate::coding::BufMutExt;
use crate::transport_parameters::{Side, TransportParameters};
#[test]
fn test_parameter_validation_generates_proper_errors() {
let mut params = TransportParameters::default();
params.ack_delay_exponent = VarInt::from_u32(21);
let mut buf = Vec::new();
params.write(&mut buf).unwrap();
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
let transport_err = TransportError::from(result.unwrap_err());
assert_eq!(u64::from(transport_err.code), 0x08); }
#[test]
fn test_connection_closes_on_parameter_error() {
use crate::transport_parameters::error_handling::TransportParameterErrorHandler;
let error_msg = "invalid transport parameter";
let close_frame = TransportParameterErrorHandler::create_close_frame(error_msg);
match close_frame {
crate::frame::Close::Connection(ref conn_close) => {
assert_eq!(u64::from(conn_close.error_code), 0x08);
assert_eq!(conn_close.reason.as_ref(), error_msg.as_bytes());
assert!(conn_close.frame_type.is_none());
}
_ => panic!("Expected Connection close frame"),
}
}
#[test]
fn test_parameter_error_logging_context() {
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(1000);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
}
#[test]
fn test_nat_traversal_concurrency_limit_error_handling() {
let mut params = TransportParameters::default();
params.nat_traversal = Some(
crate::transport_parameters::NatTraversalConfig::ServerSupport {
concurrency_limit: VarInt::from_u32(0),
},
);
let mut buf = Vec::new();
params.write(&mut buf).unwrap();
let result = TransportParameters::read(Side::Server, &mut buf.as_slice());
assert!(result.is_err());
}
#[test]
fn test_multiple_validation_failures() {
let mut buf = Vec::new();
buf.write_var_or_debug_assert(0x0a); buf.write_var_or_debug_assert(1);
buf.push(21);
buf.write_var_or_debug_assert(0x03); buf.write_var_or_debug_assert(2);
buf.write_var_or_debug_assert(1000);
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_err());
let err = result.unwrap_err();
assert_eq!(err, crate::transport_parameters::Error::IllegalValue);
}
#[test]
fn test_server_only_parameters_from_client() {
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());
let err = result.unwrap_err();
assert_eq!(err, crate::transport_parameters::Error::IllegalValue);
}
#[test]
fn test_valid_parameters_pass_validation() {
let mut params = TransportParameters::default();
params.max_idle_timeout = VarInt::from_u32(30000);
params.max_udp_payload_size = VarInt::from_u32(1472);
params.initial_max_data = VarInt::from_u32(1048576);
params.initial_max_stream_data_bidi_local = VarInt::from_u32(524288);
params.initial_max_stream_data_bidi_remote = VarInt::from_u32(524288);
params.initial_max_stream_data_uni = VarInt::from_u32(524288);
params.initial_max_streams_bidi = VarInt::from_u32(100);
params.initial_max_streams_uni = VarInt::from_u32(100);
params.ack_delay_exponent = VarInt::from_u32(3);
params.max_ack_delay = VarInt::from_u32(25);
params.active_connection_id_limit = VarInt::from_u32(4);
let mut buf = Vec::new();
params.write(&mut buf).unwrap();
let result = TransportParameters::read(Side::Client, &mut buf.as_slice());
assert!(result.is_ok());
let decoded = result.unwrap();
assert_eq!(decoded.max_idle_timeout, params.max_idle_timeout);
assert_eq!(decoded.max_udp_payload_size, params.max_udp_payload_size);
}
}