use xor_name::XorName;
#[allow(unused)]
pub enum HolePunchingState {
Mapping(XorName),
Connecting(XorName, ::std::net::UdpSocket, Option<[u8; 4]>),
Punching(XorName, ::std::net::UdpSocket, Option<[u8; 4]>, u32),
RendezvousConnecting(XorName, ::std::net::UdpSocket),
}
#[cfg(test)]
mod test {
use rand;
use xor_name::XorName;
#[test]
fn hole_punching_state() {
let name: XorName = rand::random();
let secret: Option<[u8; 4]> = None;
let number_of_failed_attempts: u32 = 1;
let mapping_state = super::HolePunchingState::Mapping(name);
assert_match_state(mapping_state, true, false, false, false);
let sr1: Result<::std::net::UdpSocket, _> = ::std::net::UdpSocket::bind("127.0.0.1:34254");
match sr1 {
Err(why) => panic!("{:?}", why),
Ok(socket) => {
let connecting_state = super::HolePunchingState::Connecting(name, socket, secret);
assert_match_state(connecting_state, false, true, false, false);
}
}
let sr2: Result<::std::net::UdpSocket, _> = ::std::net::UdpSocket::bind("127.0.0.1:34254");
match sr2 {
Err(why) => panic!("{:?}", why),
Ok(socket) => {
let punching_state = super::HolePunchingState::Punching(name,
socket,
secret,
number_of_failed_attempts);
assert_match_state(punching_state, false, false, true, false);
}
}
let sr3: Result<::std::net::UdpSocket, _> = ::std::net::UdpSocket::bind("127.0.0.1:34254");
match sr3 {
Err(why) => panic!("{:?}", why),
Ok(socket) => {
let rendezvous_state = super::HolePunchingState::RendezvousConnecting(name, socket);
assert_match_state(rendezvous_state, false, false, false, true);
}
}
}
fn assert_match_state(state: ::connection_management::HolePunchingState,
is_mapping: bool,
is_connecting: bool,
is_punching: bool,
is_rendezvous_connecting: bool) {
match state {
::connection_management::HolePunchingState::Mapping(_) => assert!(is_mapping),
::connection_management::HolePunchingState::Connecting(_, _, _) => {
assert!(is_connecting)
}
::connection_management::HolePunchingState::Punching(_, _, _, _) => {
assert!(is_punching)
}
::connection_management::HolePunchingState::RendezvousConnecting(_, _) => {
assert!(is_rendezvous_connecting)
}
}
}
}