151 lines
4.4 KiB
Rust
151 lines
4.4 KiB
Rust
use super::*;
|
|
|
|
#[test]
|
|
fn connect_rejects_invalid_configuration() {
|
|
let i64_max_ns = u64::try_from(i64::MAX).unwrap();
|
|
let too_large = Duration::from_nanos(i64_max_ns) + Duration::from_nanos(1);
|
|
let cases = [
|
|
(
|
|
"oversized UDP payload",
|
|
ClientConfig {
|
|
request: SessionRequest {
|
|
length: MAX_UDP_PAYLOAD_LENGTH + 1,
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
},
|
|
"packet length",
|
|
),
|
|
(
|
|
"zero finite duration",
|
|
ClientConfig {
|
|
request: SessionRequest {
|
|
duration: Some(Duration::ZERO),
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
},
|
|
"duration must be greater than zero; use None for continuous mode",
|
|
),
|
|
(
|
|
"zero interval",
|
|
ClientConfig {
|
|
request: SessionRequest {
|
|
interval: Duration::ZERO,
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
},
|
|
"interval must be greater than zero",
|
|
),
|
|
(
|
|
"duration nanosecond overflow",
|
|
ClientConfig {
|
|
request: SessionRequest {
|
|
duration: Some(too_large),
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
},
|
|
"duration is too large to encode as nanoseconds",
|
|
),
|
|
(
|
|
"interval nanosecond overflow",
|
|
ClientConfig {
|
|
request: SessionRequest {
|
|
interval: too_large,
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
},
|
|
"interval is too large to encode as nanoseconds",
|
|
),
|
|
(
|
|
"invalid DSCP codepoint",
|
|
ClientConfig {
|
|
request: SessionRequest {
|
|
dscp: 64,
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
},
|
|
"dscp",
|
|
),
|
|
(
|
|
// The unspecified clock is the absent-tag wire default, not a
|
|
// client mode; a client that needs timestamps must name a clock.
|
|
"unspecified clock",
|
|
ClientConfig {
|
|
request: SessionRequest {
|
|
clock: Clock::Unspecified,
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
},
|
|
"clock must be wall, monotonic, or both",
|
|
),
|
|
(
|
|
"empty server fill",
|
|
ClientConfig {
|
|
request: SessionRequest {
|
|
server_fill: Some("".to_owned()),
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
},
|
|
"server_fill",
|
|
),
|
|
(
|
|
"oversized server fill",
|
|
ClientConfig {
|
|
request: SessionRequest {
|
|
server_fill: Some("0123456789abcdef0123456789abcdefx".to_owned()),
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
},
|
|
"server_fill",
|
|
),
|
|
];
|
|
|
|
for (name, config, expected_reason) in cases {
|
|
assert!(
|
|
matches!(
|
|
Client::connect("127.0.0.1:2112", config),
|
|
Err(ClientError::InvalidConfig { .. })
|
|
),
|
|
"{name} should fail with InvalidConfig ({expected_reason})"
|
|
);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn minimum_open_timeout_under_200ms_is_rejected() {
|
|
let config = ClientConfig {
|
|
open: OpenPolicy {
|
|
timeouts: vec![Duration::from_millis(199)],
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
};
|
|
assert!(matches!(
|
|
Client::connect("127.0.0.1:2112", config),
|
|
Err(ClientError::OpenTimeoutTooSmall { .. })
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn empty_open_timeouts_is_rejected() {
|
|
let config = ClientConfig {
|
|
open: OpenPolicy {
|
|
timeouts: vec![],
|
|
..Default::default()
|
|
},
|
|
..ClientConfig::default()
|
|
};
|
|
assert!(matches!(
|
|
Client::connect("127.0.0.1:2112", config),
|
|
Err(ClientError::NoOpenTimeouts)
|
|
));
|
|
}
|