diff --git a/src/magnet.rs b/src/magnet.rs index 82f6438..cd2c8b7 100644 --- a/src/magnet.rs +++ b/src/magnet.rs @@ -493,6 +493,16 @@ mod tests { assert_eq!(&magnet_url.to_string(), &magnet_str); } + #[test] + fn survives_roundtrip_tracker_urlencoding() { + // Test that tracker URLs are properly url-decoded and re-encoded. + let magnet_str = + std::fs::read_to_string("tests/bittorrent-v1-emma-goldman.magnet").unwrap(); + let magnet = MagnetLink::new(&magnet_str).unwrap(); + + assert_eq!(&magnet.to_string(), &magnet_str); + } + #[test] fn can_parse_magnet_trackers() { let expected = &[ diff --git a/src/tracker.rs b/src/tracker.rs index b1548b5..67097b4 100644 --- a/src/tracker.rs +++ b/src/tracker.rs @@ -192,3 +192,39 @@ impl PeerSource { pub trait TryIntoTracker { fn try_into_tracker(&self) -> Result; } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[cfg(not(feature = "unknown_tracker_scheme"))] + fn fail_unknown_tracker_scheme() { + let tracker = Tracker::new("wtf://example.com:8000/announce"); + assert!(tracker.is_err()); + assert_eq!( + tracker.unwrap_err(), + TrackerError::InvalidScheme { + scheme: "wtf".to_string() + }, + ); + } + + #[test] + fn fail_urlencoded_tracker() { + let tracker = Tracker::new("http%3F%2A%2A127.0.0.1:8000%2Aannounce"); + assert!(tracker.is_err()); + } + + #[test] + fn parse_ipv4_literal() { + let tracker = Tracker::new("http://127.0.0.1:8000/announce"); + assert!(tracker.is_ok()); + } + + #[test] + fn parse_ipv6_literal() { + let tracker = Tracker::new("http://[::1]:8000/announce"); + assert!(tracker.is_ok()); + } +}