#![cfg(feature = "draft14")]
use moqtap_client::draft14::session::setup::*;
use moqtap_codec::draft14::message::{ClientSetup, ServerSetup};
use moqtap_codec::varint::VarInt;
fn varint(v: u64) -> VarInt {
VarInt::from_u64(v).unwrap()
}
#[test]
fn validate_client_setup_valid() {
let setup = ClientSetup { supported_versions: vec![varint(0xff00000e)], parameters: vec![] };
let result = validate_client_setup(&setup);
assert!(result.is_ok(), "valid client setup should pass: {result:?}");
}
#[test]
fn validate_client_setup_no_versions_rejected() {
let setup = ClientSetup { supported_versions: vec![], parameters: vec![] };
let result = validate_client_setup(&setup);
assert!(result.is_err(), "empty version list should be rejected");
assert_eq!(result.unwrap_err(), SetupError::EmptyVersionList);
}
#[test]
fn validate_server_setup_valid() {
let setup = ServerSetup { selected_version: varint(0xff00000e), parameters: vec![] };
let result = validate_server_setup(&setup);
assert!(result.is_ok(), "valid server setup should pass: {result:?}");
}
#[test]
fn version_negotiation_common_version_found() {
let client_versions = vec![varint(0xff00000e)];
let server_version = varint(0xff00000e);
let result = negotiate_version(&client_versions, server_version);
assert!(result.is_ok(), "common version should be found: {result:?}");
assert_eq!(result.unwrap(), varint(0xff00000e));
}
#[test]
fn version_negotiation_no_common_version() {
let client_versions = vec![varint(0xff00000e)];
let server_version = varint(0xff000010);
let result = negotiate_version(&client_versions, server_version);
assert!(result.is_err(), "no common version should fail");
assert_eq!(result.unwrap_err(), SetupError::NoCommonVersion);
}
#[test]
fn validate_client_setup_server_only_param_rejected() {
use moqtap_codec::kvp::{KeyValuePair, KvpValue};
let setup = ClientSetup {
supported_versions: vec![varint(0xff00000e)],
parameters: vec![KeyValuePair { key: varint(0x02), value: KvpValue::Varint(varint(1)) }],
};
let result = validate_client_setup(&setup);
assert!(result.is_err(), "client setup with server-only parameter should be rejected");
assert_eq!(result.unwrap_err(), SetupError::WrongParameterRole);
}
#[test]
fn version_number_format_draft_14() {
let draft_14_version: u64 = 0xff00000e;
assert_eq!(draft_14_version & 0xff, 14);
assert_eq!(draft_14_version >> 8, 0xff0000);
}
#[test]
fn version_negotiation_multiple_client_versions() {
let client_versions = vec![varint(0xff00000d), varint(0xff00000e), varint(0xff00000f)];
let server_version = varint(0xff00000e);
let result = negotiate_version(&client_versions, server_version);
assert!(result.is_ok(), "should find common version among multiple: {result:?}");
assert_eq!(result.unwrap(), varint(0xff00000e));
}