mod tests { use super::*; #[test] fn compact_ipv6_ranges_preserve_numeric_order() { assert_eq!(std::mem::size_of::(), 34); assert_eq!(std::mem::size_of::(), 12); let ranges = [ V6Range { start: 0u128.to_be_bytes(), end: 127u128.to_be_bytes(), country: *b"PL", }, V6Range { start: 256u128.to_be_bytes(), end: 65535u128.to_be_bytes(), country: *b"DE", }, V6Range { start: (1u128 << 120).to_be_bytes(), end: u128::MAX.to_be_bytes(), country: *b"US", }, ]; for (address, expected) in [ (0, Some(*b"PL")), (127, Some(*b"PL")), (128, None), (255, None), (256, Some(*b"DE")), (65535, Some(*b"DE")), (65536, None), (1u128 << 120, Some(*b"US")), (u128::MAX, Some(*b"US")), ] { assert_eq!(find_v6(&ranges, address.to_be_bytes()), expected); } } #[test] fn range_lookup_handles_gaps() { let directory = tempfile::tempdir().unwrap(); std::fs::write( directory.path().join("user-country-ipv4.csv"), "192.0.2.0,192.0.2.255,PL\n", ) .unwrap(); std::fs::write( directory.path().join("user-country-ipv6.csv"), "2001:db8::,2001:db8::ffff,PL\n", ) .unwrap(); let db = Database::load_format(directory.path(), DatabaseFormat::CsvPair).unwrap(); assert_eq!( db.country("192.0.2.7".parse().unwrap()).as_deref(), Some("PL") ); assert!(db.country("198.51.100.1".parse().unwrap()).is_none()); } }