@@ -461,264 +461,7 @@ mod tests {
461461 use io;
462462 use net:: * ;
463463 use net:: Ipv6MulticastScope :: * ;
464-
465- #[ test]
466- fn test_from_str_ipv4 ( ) {
467- assert_eq ! ( Ok ( Ipv4Addr :: new( 127 , 0 , 0 , 1 ) ) , "127.0.0.1" . parse( ) ) ;
468- assert_eq ! ( Ok ( Ipv4Addr :: new( 255 , 255 , 255 , 255 ) ) , "255.255.255.255" . parse( ) ) ;
469- assert_eq ! ( Ok ( Ipv4Addr :: new( 0 , 0 , 0 , 0 ) ) , "0.0.0.0" . parse( ) ) ;
470-
471- // out of range
472- let none: Option < Ipv4Addr > = "256.0.0.1" . parse ( ) . ok ( ) ;
473- assert_eq ! ( None , none) ;
474- // too short
475- let none: Option < Ipv4Addr > = "255.0.0" . parse ( ) . ok ( ) ;
476- assert_eq ! ( None , none) ;
477- // too long
478- let none: Option < Ipv4Addr > = "255.0.0.1.2" . parse ( ) . ok ( ) ;
479- assert_eq ! ( None , none) ;
480- // no number between dots
481- let none: Option < Ipv4Addr > = "255.0..1" . parse ( ) . ok ( ) ;
482- assert_eq ! ( None , none) ;
483- }
484-
485- #[ test]
486- fn test_from_str_ipv6 ( ) {
487- assert_eq ! ( Ok ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) ) , "0:0:0:0:0:0:0:0" . parse( ) ) ;
488- assert_eq ! ( Ok ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) ) , "0:0:0:0:0:0:0:1" . parse( ) ) ;
489-
490- assert_eq ! ( Ok ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) ) , "::1" . parse( ) ) ;
491- assert_eq ! ( Ok ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) ) , "::" . parse( ) ) ;
492-
493- assert_eq ! ( Ok ( Ipv6Addr :: new( 0x2a02 , 0x6b8 , 0 , 0 , 0 , 0 , 0x11 , 0x11 ) ) ,
494- "2a02:6b8::11:11" . parse( ) ) ;
495-
496- // too long group
497- let none: Option < Ipv6Addr > = "::00000" . parse ( ) . ok ( ) ;
498- assert_eq ! ( None , none) ;
499- // too short
500- let none: Option < Ipv6Addr > = "1:2:3:4:5:6:7" . parse ( ) . ok ( ) ;
501- assert_eq ! ( None , none) ;
502- // too long
503- let none: Option < Ipv6Addr > = "1:2:3:4:5:6:7:8:9" . parse ( ) . ok ( ) ;
504- assert_eq ! ( None , none) ;
505- // triple colon
506- let none: Option < Ipv6Addr > = "1:2:::6:7:8" . parse ( ) . ok ( ) ;
507- assert_eq ! ( None , none) ;
508- // two double colons
509- let none: Option < Ipv6Addr > = "1:2::6::8" . parse ( ) . ok ( ) ;
510- assert_eq ! ( None , none) ;
511- }
512-
513- #[ test]
514- fn test_from_str_ipv4_in_ipv6 ( ) {
515- assert_eq ! ( Ok ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 49152 , 545 ) ) ,
516- "::192.0.2.33" . parse( ) ) ;
517- assert_eq ! ( Ok ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0xFFFF , 49152 , 545 ) ) ,
518- "::FFFF:192.0.2.33" . parse( ) ) ;
519- assert_eq ! ( Ok ( Ipv6Addr :: new( 0x64 , 0xff9b , 0 , 0 , 0 , 0 , 49152 , 545 ) ) ,
520- "64:ff9b::192.0.2.33" . parse( ) ) ;
521- assert_eq ! ( Ok ( Ipv6Addr :: new( 0x2001 , 0xdb8 , 0x122 , 0xc000 , 0x2 , 0x2100 , 49152 , 545 ) ) ,
522- "2001:db8:122:c000:2:2100:192.0.2.33" . parse( ) ) ;
523-
524- // colon after v4
525- let none: Option < Ipv4Addr > = "::127.0.0.1:" . parse ( ) . ok ( ) ;
526- assert_eq ! ( None , none) ;
527- // not enough groups
528- let none: Option < Ipv6Addr > = "1.2.3.4.5:127.0.0.1" . parse ( ) . ok ( ) ;
529- assert_eq ! ( None , none) ;
530- // too many groups
531- let none: Option < Ipv6Addr > = "1.2.3.4.5:6:7:127.0.0.1" . parse ( ) . ok ( ) ;
532- assert_eq ! ( None , none) ;
533- }
534-
535- #[ test]
536- fn test_from_str_socket_addr ( ) {
537- assert_eq ! ( Ok ( sa4( Ipv4Addr :: new( 77 , 88 , 21 , 11 ) , 80 ) ) ,
538- "77.88.21.11:80" . parse( ) ) ;
539- assert_eq ! ( Ok ( sa6( Ipv6Addr :: new( 0x2a02 , 0x6b8 , 0 , 1 , 0 , 0 , 0 , 1 ) , 53 ) ) ,
540- "[2a02:6b8:0:1::1]:53" . parse( ) ) ;
541- assert_eq ! ( Ok ( sa6( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0x7F00 , 1 ) , 22 ) ) ,
542- "[::127.0.0.1]:22" . parse( ) ) ;
543-
544- // without port
545- let none: Option < SocketAddr > = "127.0.0.1" . parse ( ) . ok ( ) ;
546- assert_eq ! ( None , none) ;
547- // without port
548- let none: Option < SocketAddr > = "127.0.0.1:" . parse ( ) . ok ( ) ;
549- assert_eq ! ( None , none) ;
550- // wrong brackets around v4
551- let none: Option < SocketAddr > = "[127.0.0.1]:22" . parse ( ) . ok ( ) ;
552- assert_eq ! ( None , none) ;
553- // port out of range
554- let none: Option < SocketAddr > = "127.0.0.1:123456" . parse ( ) . ok ( ) ;
555- assert_eq ! ( None , none) ;
556- }
557-
558- #[ test]
559- fn ipv6_addr_to_string ( ) {
560- // ipv4-mapped address
561- let a1 = Ipv6Addr :: new ( 0 , 0 , 0 , 0 , 0 , 0xffff , 0xc000 , 0x280 ) ;
562- assert_eq ! ( a1. to_string( ) , "::ffff:192.0.2.128" ) ;
563-
564- // ipv4-compatible address
565- let a1 = Ipv6Addr :: new ( 0 , 0 , 0 , 0 , 0 , 0 , 0xc000 , 0x280 ) ;
566- assert_eq ! ( a1. to_string( ) , "::192.0.2.128" ) ;
567-
568- // v6 address with no zero segments
569- assert_eq ! ( Ipv6Addr :: new( 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ) . to_string( ) ,
570- "8:9:a:b:c:d:e:f" ) ;
571-
572- // reduce a single run of zeros
573- assert_eq ! ( "ae::ffff:102:304" ,
574- Ipv6Addr :: new( 0xae , 0 , 0 , 0 , 0 , 0xffff , 0x0102 , 0x0304 ) . to_string( ) ) ;
575-
576- // don't reduce just a single zero segment
577- assert_eq ! ( "1:2:3:4:5:6:0:8" ,
578- Ipv6Addr :: new( 1 , 2 , 3 , 4 , 5 , 6 , 0 , 8 ) . to_string( ) ) ;
579-
580- // 'any' address
581- assert_eq ! ( "::" , Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) . to_string( ) ) ;
582-
583- // loopback address
584- assert_eq ! ( "::1" , Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) . to_string( ) ) ;
585-
586- // ends in zeros
587- assert_eq ! ( "1::" , Ipv6Addr :: new( 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) . to_string( ) ) ;
588-
589- // two runs of zeros, second one is longer
590- assert_eq ! ( "1:0:0:4::8" , Ipv6Addr :: new( 1 , 0 , 0 , 4 , 0 , 0 , 0 , 8 ) . to_string( ) ) ;
591-
592- // two runs of zeros, equal length
593- assert_eq ! ( "1::4:5:0:0:8" , Ipv6Addr :: new( 1 , 0 , 0 , 4 , 5 , 0 , 0 , 8 ) . to_string( ) ) ;
594- }
595-
596- #[ test]
597- fn ipv4_to_ipv6 ( ) {
598- assert_eq ! ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0xffff , 0x1234 , 0x5678 ) ,
599- Ipv4Addr :: new( 0x12 , 0x34 , 0x56 , 0x78 ) . to_ipv6_mapped( ) ) ;
600- assert_eq ! ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0x1234 , 0x5678 ) ,
601- Ipv4Addr :: new( 0x12 , 0x34 , 0x56 , 0x78 ) . to_ipv6_compatible( ) ) ;
602- }
603-
604- #[ test]
605- fn ipv6_to_ipv4 ( ) {
606- assert_eq ! ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0xffff , 0x1234 , 0x5678 ) . to_ipv4( ) ,
607- Some ( Ipv4Addr :: new( 0x12 , 0x34 , 0x56 , 0x78 ) ) ) ;
608- assert_eq ! ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0x1234 , 0x5678 ) . to_ipv4( ) ,
609- Some ( Ipv4Addr :: new( 0x12 , 0x34 , 0x56 , 0x78 ) ) ) ;
610- assert_eq ! ( Ipv6Addr :: new( 0 , 0 , 1 , 0 , 0 , 0 , 0x1234 , 0x5678 ) . to_ipv4( ) ,
611- None ) ;
612- }
613-
614- #[ test]
615- fn ipv4_properties ( ) {
616- fn check ( octets : & [ u8 ; 4 ] , unspec : bool , loopback : bool ,
617- private : bool , link_local : bool , global : bool ,
618- multicast : bool , broadcast : bool , documentation : bool ) {
619- let ip = Ipv4Addr :: new ( octets[ 0 ] , octets[ 1 ] , octets[ 2 ] , octets[ 3 ] ) ;
620- assert_eq ! ( octets, & ip. octets( ) ) ;
621-
622- assert_eq ! ( ip. is_unspecified( ) , unspec) ;
623- assert_eq ! ( ip. is_loopback( ) , loopback) ;
624- assert_eq ! ( ip. is_private( ) , private) ;
625- assert_eq ! ( ip. is_link_local( ) , link_local) ;
626- assert_eq ! ( ip. is_global( ) , global) ;
627- assert_eq ! ( ip. is_multicast( ) , multicast) ;
628- assert_eq ! ( ip. is_broadcast( ) , broadcast) ;
629- assert_eq ! ( ip. is_documentation( ) , documentation) ;
630- }
631-
632- // address unspec loopbk privt linloc global multicast brdcast doc
633- check ( & [ 0 , 0 , 0 , 0 ] , true , false , false , false , true , false , false , false ) ;
634- check ( & [ 0 , 0 , 0 , 1 ] , false , false , false , false , true , false , false , false ) ;
635- check ( & [ 1 , 0 , 0 , 0 ] , false , false , false , false , true , false , false , false ) ;
636- check ( & [ 10 , 9 , 8 , 7 ] , false , false , true , false , false , false , false , false ) ;
637- check ( & [ 127 , 1 , 2 , 3 ] , false , true , false , false , false , false , false , false ) ;
638- check ( & [ 172 , 31 , 254 , 253 ] , false , false , true , false , false , false , false , false ) ;
639- check ( & [ 169 , 254 , 253 , 242 ] , false , false , false , true , false , false , false , false ) ;
640- check ( & [ 192 , 168 , 254 , 253 ] , false , false , true , false , false , false , false , false ) ;
641- check ( & [ 224 , 0 , 0 , 0 ] , false , false , false , false , true , true , false , false ) ;
642- check ( & [ 239 , 255 , 255 , 255 ] , false , false , false , false , true , true , false , false ) ;
643- check ( & [ 255 , 255 , 255 , 255 ] , false , false , false , false , false , false , true , false ) ;
644- check ( & [ 198 , 51 , 100 , 0 ] , false , false , false , false , false , false , false , true ) ;
645- }
646-
647- #[ test]
648- fn ipv6_properties ( ) {
649- fn check ( str_addr : & str , unspec : bool , loopback : bool ,
650- unique_local : bool , global : bool ,
651- u_link_local : bool , u_site_local : bool , u_global : bool ,
652- m_scope : Option < Ipv6MulticastScope > ) {
653- let ip: Ipv6Addr = str_addr. parse ( ) . unwrap ( ) ;
654- assert_eq ! ( str_addr, ip. to_string( ) ) ;
655-
656- assert_eq ! ( ip. is_unspecified( ) , unspec) ;
657- assert_eq ! ( ip. is_loopback( ) , loopback) ;
658- assert_eq ! ( ip. is_unique_local( ) , unique_local) ;
659- assert_eq ! ( ip. is_global( ) , global) ;
660- assert_eq ! ( ip. is_unicast_link_local( ) , u_link_local) ;
661- assert_eq ! ( ip. is_unicast_site_local( ) , u_site_local) ;
662- assert_eq ! ( ip. is_unicast_global( ) , u_global) ;
663- assert_eq ! ( ip. multicast_scope( ) , m_scope) ;
664- assert_eq ! ( ip. is_multicast( ) , m_scope. is_some( ) ) ;
665- }
666-
667- // unspec loopbk uniqlo global unill unisl uniglo mscope
668- check ( "::" ,
669- true , false , false , true , false , false , true , None ) ;
670- check ( "::1" ,
671- false , true , false , false , false , false , false , None ) ;
672- check ( "::0.0.0.2" ,
673- false , false , false , true , false , false , true , None ) ;
674- check ( "1::" ,
675- false , false , false , true , false , false , true , None ) ;
676- check ( "fc00::" ,
677- false , false , true , false , false , false , false , None ) ;
678- check ( "fdff:ffff::" ,
679- false , false , true , false , false , false , false , None ) ;
680- check ( "fe80:ffff::" ,
681- false , false , false , false , true , false , false , None ) ;
682- check ( "febf:ffff::" ,
683- false , false , false , false , true , false , false , None ) ;
684- check ( "fec0::" ,
685- false , false , false , false , false , true , false , None ) ;
686- check ( "ff01::" ,
687- false , false , false , false , false , false , false , Some ( InterfaceLocal ) ) ;
688- check ( "ff02::" ,
689- false , false , false , false , false , false , false , Some ( LinkLocal ) ) ;
690- check ( "ff03::" ,
691- false , false , false , false , false , false , false , Some ( RealmLocal ) ) ;
692- check ( "ff04::" ,
693- false , false , false , false , false , false , false , Some ( AdminLocal ) ) ;
694- check ( "ff05::" ,
695- false , false , false , false , false , false , false , Some ( SiteLocal ) ) ;
696- check ( "ff08::" ,
697- false , false , false , false , false , false , false , Some ( OrganizationLocal ) ) ;
698- check ( "ff0e::" ,
699- false , false , false , true , false , false , false , Some ( Global ) ) ;
700- }
701-
702- fn tsa < A : ToSocketAddrs > ( a : A ) -> Result < Vec < SocketAddr > , String > {
703- match a. to_socket_addrs ( ) {
704- Ok ( a) => Ok ( a. collect ( ) ) ,
705- Err ( e) => Err ( e. to_string ( ) ) ,
706- }
707- }
708-
709- #[ test]
710- fn to_socket_addr_socketaddr ( ) {
711- let a = sa4 ( Ipv4Addr :: new ( 77 , 88 , 21 , 11 ) , 12345 ) ;
712- assert_eq ! ( Ok ( vec![ a] ) , tsa( a) ) ;
713- }
714-
715- fn sa4 ( a : Ipv4Addr , p : u16 ) -> SocketAddr {
716- SocketAddr :: V4 ( SocketAddrV4 :: new ( a, p) )
717- }
718-
719- fn sa6 ( a : Ipv6Addr , p : u16 ) -> SocketAddr {
720- SocketAddr :: V6 ( SocketAddrV6 :: new ( a, p, 0 , 0 ) )
721- }
464+ use net:: test:: { tsa, sa6, sa4} ;
722465
723466 #[ test]
724467 fn to_socket_addr_ipaddr_u16 ( ) {
0 commit comments