147 lines
4.7 KiB
Rust
147 lines
4.7 KiB
Rust
use super::*;
|
|
|
|
#[test]
|
|
fn strict_negotiation_accepts_identical_params() {
|
|
let config = ClientConfig::default();
|
|
let params = params_from_config(&config).unwrap();
|
|
assert!(validate_negotiated_params(¶ms, ¶ms, NegotiationPolicy::Strict).is_ok());
|
|
}
|
|
|
|
#[test]
|
|
fn strict_negotiation_rejects_changed_params() {
|
|
let config = ClientConfig::default();
|
|
let requested = params_from_config(&config).unwrap();
|
|
let mut returned = requested.clone();
|
|
returned.dscp = 1;
|
|
assert!(matches!(
|
|
validate_negotiated_params(&requested, &returned, NegotiationPolicy::Strict),
|
|
Err(ClientError::NegotiationRejected { .. })
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn loose_negotiation_accepts_server_restricted_params() {
|
|
let config = ClientConfig::default();
|
|
let requested = params_from_config(&config).unwrap();
|
|
let mut returned = requested.clone();
|
|
returned.duration_ns /= 2;
|
|
returned.length = 0;
|
|
assert!(validate_negotiated_params(&requested, &returned, NegotiationPolicy::Loose).is_ok());
|
|
}
|
|
|
|
#[test]
|
|
fn loose_negotiation_rejects_non_positive_returned_interval() {
|
|
let config = ClientConfig::default();
|
|
let requested = params_from_config(&config).unwrap();
|
|
|
|
for interval_ns in [0, -1] {
|
|
let mut returned = requested.clone();
|
|
returned.interval_ns = interval_ns;
|
|
assert!(matches!(
|
|
validate_negotiated_params(&requested, &returned, NegotiationPolicy::Loose),
|
|
Err(ClientError::NegotiationRejected { reason })
|
|
if reason == "interval must be positive"
|
|
));
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn loose_negotiation_accepts_documented_duration_combinations() {
|
|
let finite_config = ClientConfig::default();
|
|
let requested_finite = params_from_config(&finite_config).unwrap();
|
|
|
|
let returned_same_finite = requested_finite.clone();
|
|
assert!(validate_negotiated_params(
|
|
&requested_finite,
|
|
&returned_same_finite,
|
|
NegotiationPolicy::Loose
|
|
)
|
|
.is_ok());
|
|
|
|
let mut returned_shorter_finite = requested_finite.clone();
|
|
returned_shorter_finite.duration_ns /= 2;
|
|
assert!(validate_negotiated_params(
|
|
&requested_finite,
|
|
&returned_shorter_finite,
|
|
NegotiationPolicy::Loose
|
|
)
|
|
.is_ok());
|
|
|
|
let continuous_config = ClientConfig {
|
|
duration: None,
|
|
..ClientConfig::default()
|
|
};
|
|
let requested_continuous = params_from_config(&continuous_config).unwrap();
|
|
|
|
let returned_continuous = requested_continuous.clone();
|
|
assert!(validate_negotiated_params(
|
|
&requested_continuous,
|
|
&returned_continuous,
|
|
NegotiationPolicy::Loose
|
|
)
|
|
.is_ok());
|
|
|
|
let mut returned_finite = requested_continuous.clone();
|
|
returned_finite.duration_ns = 1_000_000_000;
|
|
assert!(validate_negotiated_params(
|
|
&requested_continuous,
|
|
&returned_finite,
|
|
NegotiationPolicy::Loose
|
|
)
|
|
.is_ok());
|
|
}
|
|
|
|
#[test]
|
|
fn loose_negotiation_rejects_finite_request_returned_continuous() {
|
|
let config = ClientConfig::default();
|
|
let requested = params_from_config(&config).unwrap();
|
|
let mut returned = requested.clone();
|
|
returned.duration_ns = 0;
|
|
|
|
assert!(matches!(
|
|
validate_negotiated_params(&requested, &returned, NegotiationPolicy::Loose),
|
|
Err(ClientError::NegotiationRejected { reason })
|
|
if reason == "server returned continuous duration for finite request"
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn loose_negotiation_rejects_negative_returned_length() {
|
|
let config = ClientConfig::default();
|
|
let requested = params_from_config(&config).unwrap();
|
|
let mut returned = requested.clone();
|
|
returned.length = -1;
|
|
assert!(matches!(
|
|
validate_negotiated_params(&requested, &returned, NegotiationPolicy::Loose),
|
|
Err(ClientError::NegotiationRejected { reason }) if reason == "length must be non-negative"
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn strict_negotiation_rejects_negative_returned_length() {
|
|
let config = ClientConfig::default();
|
|
let requested = params_from_config(&config).unwrap();
|
|
let mut returned = requested.clone();
|
|
returned.length = -1;
|
|
assert!(matches!(
|
|
validate_negotiated_params(&requested, &returned, NegotiationPolicy::Strict),
|
|
Err(ClientError::NegotiationRejected { reason }) if reason == "length must be non-negative"
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn loose_negotiation_rejects_runtime_invalid_returned_dscp() {
|
|
let config = ClientConfig::default();
|
|
let requested = params_from_config(&config).unwrap();
|
|
|
|
for dscp in [-1, 64] {
|
|
let mut returned = requested.clone();
|
|
returned.dscp = dscp;
|
|
assert!(matches!(
|
|
validate_negotiated_params(&requested, &returned, NegotiationPolicy::Loose),
|
|
Err(ClientError::NegotiationRejected { reason })
|
|
if reason == "dscp must be in range 0..=63"
|
|
));
|
|
}
|
|
}
|