mirror of
				https://github.com/libp2p/go-libp2p.git
				synced 2025-10-31 20:02:48 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			233 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			233 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package addrutil
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 
 | |
| 	manet "QmU5s159q8cZuM1f9Vqti4LHu6y8zyVc5dxv2py81sdp6Q/go-multiaddr-net"
 | |
| 	ma "QmbWxL1aXQhBjc1XGjGF1f2KGBMCBYSuT2ThA8YXnXJK83/go-multiaddr"
 | |
| )
 | |
| 
 | |
| func newMultiaddr(t *testing.T, s string) ma.Multiaddr {
 | |
| 	maddr, err := ma.NewMultiaddr(s)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	return maddr
 | |
| }
 | |
| 
 | |
| func TestFilterAddrs(t *testing.T) {
 | |
| 
 | |
| 	bad := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/1.2.3.4/udp/1234"),           // unreliable
 | |
| 		newMultiaddr(t, "/ip4/1.2.3.4/udp/1234/sctp/1234"), // not in manet
 | |
| 		newMultiaddr(t, "/ip4/1.2.3.4/udp/1234/utp"),       // utp is broken
 | |
| 		newMultiaddr(t, "/ip4/1.2.3.4/udp/1234/udt"),       // udt is broken on arm
 | |
| 		newMultiaddr(t, "/ip6/fe80::1/tcp/1234"),           // link local
 | |
| 		newMultiaddr(t, "/ip6/fe80::100/tcp/1234"),         // link local
 | |
| 	}
 | |
| 
 | |
| 	good := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::1/tcp/1234"),
 | |
| 	}
 | |
| 
 | |
| 	goodAndBad := append(good, bad...)
 | |
| 
 | |
| 	// test filters
 | |
| 
 | |
| 	for _, a := range bad {
 | |
| 		if AddrUsable(a, false) {
 | |
| 			t.Errorf("addr %s should be unusable", a)
 | |
| 		}
 | |
| 		if AddrUsable(a, true) {
 | |
| 			t.Errorf("addr %s should be unusable", a)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	for _, a := range good {
 | |
| 		if !AddrUsable(a, false) {
 | |
| 			t.Errorf("addr %s should be usable", a)
 | |
| 		}
 | |
| 		if !AddrUsable(a, true) {
 | |
| 			t.Errorf("addr %s should be usable", a)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	subtestAddrsEqual(t, FilterUsableAddrs(bad), []ma.Multiaddr{})
 | |
| 	subtestAddrsEqual(t, FilterUsableAddrs(good), good)
 | |
| 	subtestAddrsEqual(t, FilterUsableAddrs(goodAndBad), good)
 | |
| }
 | |
| 
 | |
| func subtestAddrsEqual(t *testing.T, a, b []ma.Multiaddr) {
 | |
| 	if len(a) != len(b) {
 | |
| 		t.Error(t)
 | |
| 	}
 | |
| 
 | |
| 	in := func(addr ma.Multiaddr, l []ma.Multiaddr) bool {
 | |
| 		for _, addr2 := range l {
 | |
| 			if addr.Equal(addr2) {
 | |
| 				return true
 | |
| 			}
 | |
| 		}
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	for _, aa := range a {
 | |
| 		if !in(aa, b) {
 | |
| 			t.Errorf("%s not in %s", aa, b)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestInterfaceAddrs(t *testing.T) {
 | |
| 	addrs, err := InterfaceAddresses()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	if len(addrs) < 1 {
 | |
| 		t.Error("no addresses")
 | |
| 	}
 | |
| 
 | |
| 	for _, a := range addrs {
 | |
| 		if manet.IsIP6LinkLocal(a) {
 | |
| 			t.Error("should not return ip link local addresses", a)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if len(addrs) < 1 {
 | |
| 		t.Error("no good interface addrs")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestResolvingAddrs(t *testing.T) {
 | |
| 
 | |
| 	unspec := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/0.0.0.0/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip4/1.2.3.4/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::100/tcp/1234"),
 | |
| 	}
 | |
| 
 | |
| 	iface := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/127.0.0.1"),
 | |
| 		newMultiaddr(t, "/ip4/10.20.30.40"),
 | |
| 		newMultiaddr(t, "/ip6/::1"),
 | |
| 		newMultiaddr(t, "/ip6/::f"),
 | |
| 	}
 | |
| 
 | |
| 	spec := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip4/10.20.30.40/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip4/1.2.3.4/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::f/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::100/tcp/1234"),
 | |
| 	}
 | |
| 
 | |
| 	actual, err := ResolveUnspecifiedAddresses(unspec, iface)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	for i, a := range actual {
 | |
| 		if !a.Equal(spec[i]) {
 | |
| 			t.Error(a, " != ", spec[i])
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	ip4u := []ma.Multiaddr{newMultiaddr(t, "/ip4/0.0.0.0")}
 | |
| 	ip4i := []ma.Multiaddr{newMultiaddr(t, "/ip4/1.2.3.4")}
 | |
| 
 | |
| 	ip6u := []ma.Multiaddr{newMultiaddr(t, "/ip6/::")}
 | |
| 	ip6i := []ma.Multiaddr{newMultiaddr(t, "/ip6/::1")}
 | |
| 
 | |
| 	if _, err := ResolveUnspecifiedAddress(ip4u[0], ip6i); err == nil {
 | |
| 		t.Fatal("should have failed")
 | |
| 	}
 | |
| 	if _, err := ResolveUnspecifiedAddress(ip6u[0], ip4i); err == nil {
 | |
| 		t.Fatal("should have failed")
 | |
| 	}
 | |
| 
 | |
| 	if _, err := ResolveUnspecifiedAddresses(ip6u, ip4i); err == nil {
 | |
| 		t.Fatal("should have failed")
 | |
| 	}
 | |
| 	if _, err := ResolveUnspecifiedAddresses(ip4u, ip6i); err == nil {
 | |
| 		t.Fatal("should have failed")
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| func TestWANShareable(t *testing.T) {
 | |
| 
 | |
| 	wanok := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/1.2.3.4/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/abcd::1/tcp/1234"),
 | |
| 	}
 | |
| 
 | |
| 	wanbad := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip4/0.0.0.0/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/fe80::1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/fe80::/tcp/1234"),
 | |
| 	}
 | |
| 
 | |
| 	for _, a := range wanok {
 | |
| 		if !AddrIsShareableOnWAN(a) {
 | |
| 			t.Error("should be true", a)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	for _, a := range wanbad {
 | |
| 		if AddrIsShareableOnWAN(a) {
 | |
| 			t.Error("should be false", a)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	wanok2 := WANShareableAddrs(wanok)
 | |
| 	if len(wanok) != len(wanok2) {
 | |
| 		t.Error("should be the same")
 | |
| 	}
 | |
| 
 | |
| 	wanbad2 := WANShareableAddrs(wanbad)
 | |
| 	if len(wanbad2) != 0 {
 | |
| 		t.Error("should be zero")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestSubtract(t *testing.T) {
 | |
| 
 | |
| 	a := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip4/0.0.0.0/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/fe80::1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/fe80::/tcp/1234"),
 | |
| 	}
 | |
| 
 | |
| 	b := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::1/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/fe80::1/tcp/1234"),
 | |
| 	}
 | |
| 
 | |
| 	c1 := []ma.Multiaddr{
 | |
| 		newMultiaddr(t, "/ip4/0.0.0.0/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/::/tcp/1234"),
 | |
| 		newMultiaddr(t, "/ip6/fe80::/tcp/1234"),
 | |
| 	}
 | |
| 
 | |
| 	c2 := Subtract(a, b)
 | |
| 	if len(c1) != len(c2) {
 | |
| 		t.Error("should be the same")
 | |
| 	}
 | |
| 	for i, ca := range c1 {
 | |
| 		if !c2[i].Equal(ca) {
 | |
| 			t.Error("should be the same", ca, c2[i])
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
