spill 0.5.1

Modern torrent client
Documentation
use spill::protocol::compact::*;

#[test]
fn compact_endpoints_roundtrip_borrowing_tails_and_limits() {
    let v4 = [192, 0, 2, 1, 0x1a, 0xe1];
    let v6 = [0; 18];
    let address = decode_v4(&v4).unwrap();
    assert_eq!(address.to_string(), "192.0.2.1:6881");
    assert_eq!(encode_v4(address), v4);
    assert_eq!(encode_v6(decode_v6(&v6).unwrap()).unwrap(), v6);
    for length in 0..=36 {
        assert_eq!(decode_v4(&vec![0; length]).is_ok(), length == 6);
        assert_eq!(decode_v6(&vec![0; length]).is_ok(), length == 18);
    }
    for tail in 0..18 {
        let wire = [v6.repeat(2), vec![0xff; tail]].concat();
        let peers = PeersV6::parse(&wire, 2).unwrap();
        assert_eq!(peers.iter().count(), 2);
        assert_eq!(peers.remainder().as_ptr(), wire[36..].as_ptr());
        assert_eq!(peers.remainder(), vec![0xff; tail]);
        assert!(PeersV6::parse(&wire, 1).is_err());
    }
    for tail in 0..6 {
        let wire = [v4.repeat(2), vec![0xff; tail]].concat();
        let peers = PeersV4::parse(&wire, 2).unwrap();
        assert_eq!(peers.iter().collect::<Vec<_>>(), [address; 2]);
        assert_eq!(peers.remainder(), vec![0xff; tail]);
        assert!(PeersV4::parse(&wire, 1).is_err());
    }
    let scoped = "[fe80::1%2]:6881".parse().unwrap();
    assert!(encode_v6(scoped).is_err());
}