use super::*;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
use bytes::{BufMut, BytesMut};
use crate::VarInt;
#[test]
fn test_observed_address_frame_ipv4() {
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(192, 168, 1, 1)), 8080);
let frame = ObservedAddress {
sequence_number: VarInt::from_u32(1),
address: addr,
};
let mut buf = BytesMut::new();
frame.encode(&mut buf);
assert_eq!(buf[0], 0x80); assert_eq!(buf[1], 0x9f); assert_eq!(buf[2], 0x81); assert_eq!(buf[3], 0xa6);
let mut reader = &buf[4..];
let decoded = ObservedAddress::decode(&mut reader, false).unwrap();
assert_eq!(decoded.sequence_number, VarInt::from_u32(1));
assert_eq!(decoded.address, addr);
}
#[test]
fn test_observed_address_frame_ipv6() {
let addr = SocketAddr::new(
IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1)),
443
);
let frame = ObservedAddress {
sequence_number: VarInt::from_u32(2),
address: addr,
};
let mut buf = BytesMut::new();
frame.encode(&mut buf);
assert_eq!(buf[0], 0x80); assert_eq!(buf[1], 0x9f); assert_eq!(buf[2], 0x81); assert_eq!(buf[3], 0xa7);
let mut reader = &buf[4..];
let decoded = ObservedAddress::decode(&mut reader, true).unwrap();
assert_eq!(decoded.sequence_number, VarInt::from_u32(2));
assert_eq!(decoded.address, addr);
}
#[test]
fn test_observed_address_malformed() {
let buf = BytesMut::new();
let mut reader = &buf[..];
assert!(ObservedAddress::decode(&mut reader, false).is_err());
let buf = BytesMut::new();
let mut reader = &buf[..];
assert!(ObservedAddress::decode(&mut reader, false).is_err());
let mut buf = BytesMut::new();
crate::coding::BufMutExt::write_var_or_debug_assert(&mut buf, 1); buf.put_slice(&[192, 168]); let mut reader = &buf[..];
assert!(ObservedAddress::decode(&mut reader, false).is_err());
let mut buf = BytesMut::new();
crate::coding::BufMutExt::write_var_or_debug_assert(&mut buf, 1); buf.put_slice(&[0; 8]); let mut reader = &buf[..];
assert!(ObservedAddress::decode(&mut reader, true).is_err());
}
#[test]
fn test_observed_address_edge_cases() {
let loopback_v4 = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 80);
let loopback_v6 = SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 80);
for addr in [loopback_v4, loopback_v6] {
let frame = ObservedAddress {
sequence_number: VarInt::from_u32(3),
address: addr,
};
let mut buf = BytesMut::new();
frame.encode(&mut buf);
let mut reader = &buf[4..]; let is_ipv6 = addr.is_ipv6();
let decoded = ObservedAddress::decode(&mut reader, is_ipv6).unwrap();
assert_eq!(decoded.sequence_number, VarInt::from_u32(3));
assert_eq!(decoded.address, addr);
}
let test_ports = vec![0, 1, 80, 443, 8080, 32768, 65535];
for port in test_ports {
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(10, 0, 0, 1)), port);
let frame = ObservedAddress {
sequence_number: VarInt::from_u32(4),
address: addr,
};
let mut buf = BytesMut::new();
frame.encode(&mut buf);
let mut reader = &buf[4..]; let decoded = ObservedAddress::decode(&mut reader, false).unwrap(); assert_eq!(decoded.sequence_number, VarInt::from_u32(4));
assert_eq!(decoded.address.port(), port);
}
}
#[test]
fn test_observed_address_wire_format() {
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(192, 168, 1, 1)), 8080);
let frame = ObservedAddress {
sequence_number: VarInt::from_u32(5),
address: addr,
};
let mut buf = BytesMut::new();
frame.encode(&mut buf);
let expected = vec![
0x80, 0x9f, 0x81, 0xa6, 5, 192, 168, 1, 1, 0x1F, 0x90, ];
assert_eq!(&buf[..], &expected[..]);
}
#[test]
fn test_observed_address_frame_integration() {
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(10, 0, 0, 1)), 5000);
let observed_frame = ObservedAddress {
sequence_number: VarInt::from_u32(6),
address: addr,
};
let frame = Frame::ObservedAddress(observed_frame);
match &frame {
Frame::ObservedAddress(obs) => {
assert_eq!(obs.address, addr);
let mut buf = BytesMut::new();
obs.encode(&mut buf);
assert_eq!(buf[0], 0x80); assert_eq!(buf[1], 0x9f); assert_eq!(buf[2], 0x81); assert_eq!(buf[3], 0xa6); }
_ => panic!("Wrong frame type"),
}
}
#[test]
fn test_observed_address_unspecified() {
let unspecified_v4 = SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 0);
let unspecified_v6 = SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), 0);
for addr in [unspecified_v4, unspecified_v6] {
let frame = ObservedAddress {
sequence_number: VarInt::from_u32(7),
address: addr,
};
let mut buf = BytesMut::new();
frame.encode(&mut buf);
let mut reader = &buf[4..]; let is_ipv6 = addr.is_ipv6();
let decoded = ObservedAddress::decode(&mut reader, is_ipv6).unwrap();
assert_eq!(decoded.sequence_number, VarInt::from_u32(7));
assert_eq!(decoded.address, addr);
}
}