github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/p2p/net/swarm/addr/addr_test.go (about)

     1  package addrutil
     2  
     3  import (
     4  	"testing"
     5  
     6  	ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
     7  	manet "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net"
     8  )
     9  
    10  func newMultiaddr(t *testing.T, s string) ma.Multiaddr {
    11  	maddr, err := ma.NewMultiaddr(s)
    12  	if err != nil {
    13  		t.Fatal(err)
    14  	}
    15  	return maddr
    16  }
    17  
    18  func TestFilterAddrs(t *testing.T) {
    19  
    20  	bad := []ma.Multiaddr{
    21  		newMultiaddr(t, "/ip4/1.2.3.4/udp/1234"),           // unreliable
    22  		newMultiaddr(t, "/ip4/1.2.3.4/udp/1234/sctp/1234"), // not in manet
    23  		newMultiaddr(t, "/ip4/1.2.3.4/udp/1234/utp"),       // utp is broken
    24  		newMultiaddr(t, "/ip4/1.2.3.4/udp/1234/udt"),       // udt is broken on arm
    25  		newMultiaddr(t, "/ip6/fe80::1/tcp/1234"),           // link local
    26  		newMultiaddr(t, "/ip6/fe80::100/tcp/1234"),         // link local
    27  	}
    28  
    29  	good := []ma.Multiaddr{
    30  		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
    31  		newMultiaddr(t, "/ip6/::1/tcp/1234"),
    32  	}
    33  
    34  	goodAndBad := append(good, bad...)
    35  
    36  	// test filters
    37  
    38  	for _, a := range bad {
    39  		if AddrUsable(a, false) {
    40  			t.Errorf("addr %s should be unusable", a)
    41  		}
    42  		if AddrUsable(a, true) {
    43  			t.Errorf("addr %s should be unusable", a)
    44  		}
    45  	}
    46  
    47  	for _, a := range good {
    48  		if !AddrUsable(a, false) {
    49  			t.Errorf("addr %s should be usable", a)
    50  		}
    51  		if !AddrUsable(a, true) {
    52  			t.Errorf("addr %s should be usable", a)
    53  		}
    54  	}
    55  
    56  	subtestAddrsEqual(t, FilterUsableAddrs(bad), []ma.Multiaddr{})
    57  	subtestAddrsEqual(t, FilterUsableAddrs(good), good)
    58  	subtestAddrsEqual(t, FilterUsableAddrs(goodAndBad), good)
    59  }
    60  
    61  func subtestAddrsEqual(t *testing.T, a, b []ma.Multiaddr) {
    62  	if len(a) != len(b) {
    63  		t.Error(t)
    64  	}
    65  
    66  	in := func(addr ma.Multiaddr, l []ma.Multiaddr) bool {
    67  		for _, addr2 := range l {
    68  			if addr.Equal(addr2) {
    69  				return true
    70  			}
    71  		}
    72  		return false
    73  	}
    74  
    75  	for _, aa := range a {
    76  		if !in(aa, b) {
    77  			t.Errorf("%s not in %s", aa, b)
    78  		}
    79  	}
    80  }
    81  
    82  func TestInterfaceAddrs(t *testing.T) {
    83  	addrs, err := InterfaceAddresses()
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  
    88  	if len(addrs) < 1 {
    89  		t.Error("no addresses")
    90  	}
    91  
    92  	for _, a := range addrs {
    93  		if manet.IsIP6LinkLocal(a) {
    94  			t.Error("should not return ip link local addresses", a)
    95  		}
    96  	}
    97  
    98  	if len(addrs) < 1 {
    99  		t.Error("no good interface addrs")
   100  	}
   101  }
   102  
   103  func TestResolvingAddrs(t *testing.T) {
   104  
   105  	unspec := []ma.Multiaddr{
   106  		newMultiaddr(t, "/ip4/0.0.0.0/tcp/1234"),
   107  		newMultiaddr(t, "/ip4/1.2.3.4/tcp/1234"),
   108  		newMultiaddr(t, "/ip6/::/tcp/1234"),
   109  		newMultiaddr(t, "/ip6/::100/tcp/1234"),
   110  	}
   111  
   112  	iface := []ma.Multiaddr{
   113  		newMultiaddr(t, "/ip4/127.0.0.1"),
   114  		newMultiaddr(t, "/ip4/10.20.30.40"),
   115  		newMultiaddr(t, "/ip6/::1"),
   116  		newMultiaddr(t, "/ip6/::f"),
   117  	}
   118  
   119  	spec := []ma.Multiaddr{
   120  		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
   121  		newMultiaddr(t, "/ip4/10.20.30.40/tcp/1234"),
   122  		newMultiaddr(t, "/ip4/1.2.3.4/tcp/1234"),
   123  		newMultiaddr(t, "/ip6/::1/tcp/1234"),
   124  		newMultiaddr(t, "/ip6/::f/tcp/1234"),
   125  		newMultiaddr(t, "/ip6/::100/tcp/1234"),
   126  	}
   127  
   128  	actual, err := ResolveUnspecifiedAddresses(unspec, iface)
   129  	if err != nil {
   130  		t.Fatal(err)
   131  	}
   132  
   133  	for i, a := range actual {
   134  		if !a.Equal(spec[i]) {
   135  			t.Error(a, " != ", spec[i])
   136  		}
   137  	}
   138  
   139  	ip4u := []ma.Multiaddr{newMultiaddr(t, "/ip4/0.0.0.0")}
   140  	ip4i := []ma.Multiaddr{newMultiaddr(t, "/ip4/1.2.3.4")}
   141  
   142  	ip6u := []ma.Multiaddr{newMultiaddr(t, "/ip6/::")}
   143  	ip6i := []ma.Multiaddr{newMultiaddr(t, "/ip6/::1")}
   144  
   145  	if _, err := ResolveUnspecifiedAddress(ip4u[0], ip6i); err == nil {
   146  		t.Fatal("should have failed")
   147  	}
   148  	if _, err := ResolveUnspecifiedAddress(ip6u[0], ip4i); err == nil {
   149  		t.Fatal("should have failed")
   150  	}
   151  
   152  	if _, err := ResolveUnspecifiedAddresses(ip6u, ip4i); err == nil {
   153  		t.Fatal("should have failed")
   154  	}
   155  	if _, err := ResolveUnspecifiedAddresses(ip4u, ip6i); err == nil {
   156  		t.Fatal("should have failed")
   157  	}
   158  
   159  }
   160  
   161  func TestWANShareable(t *testing.T) {
   162  
   163  	wanok := []ma.Multiaddr{
   164  		newMultiaddr(t, "/ip4/1.2.3.4/tcp/1234"),
   165  		newMultiaddr(t, "/ip6/abcd::1/tcp/1234"),
   166  	}
   167  
   168  	wanbad := []ma.Multiaddr{
   169  		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
   170  		newMultiaddr(t, "/ip4/0.0.0.0/tcp/1234"),
   171  		newMultiaddr(t, "/ip6/::1/tcp/1234"),
   172  		newMultiaddr(t, "/ip6/::/tcp/1234"),
   173  		newMultiaddr(t, "/ip6/fe80::1/tcp/1234"),
   174  		newMultiaddr(t, "/ip6/fe80::/tcp/1234"),
   175  	}
   176  
   177  	for _, a := range wanok {
   178  		if !AddrIsShareableOnWAN(a) {
   179  			t.Error("should be true", a)
   180  		}
   181  	}
   182  
   183  	for _, a := range wanbad {
   184  		if AddrIsShareableOnWAN(a) {
   185  			t.Error("should be false", a)
   186  		}
   187  	}
   188  
   189  	wanok2 := WANShareableAddrs(wanok)
   190  	if len(wanok) != len(wanok2) {
   191  		t.Error("should be the same")
   192  	}
   193  
   194  	wanbad2 := WANShareableAddrs(wanbad)
   195  	if len(wanbad2) != 0 {
   196  		t.Error("should be zero")
   197  	}
   198  }
   199  
   200  func TestSubtract(t *testing.T) {
   201  
   202  	a := []ma.Multiaddr{
   203  		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
   204  		newMultiaddr(t, "/ip4/0.0.0.0/tcp/1234"),
   205  		newMultiaddr(t, "/ip6/::1/tcp/1234"),
   206  		newMultiaddr(t, "/ip6/::/tcp/1234"),
   207  		newMultiaddr(t, "/ip6/fe80::1/tcp/1234"),
   208  		newMultiaddr(t, "/ip6/fe80::/tcp/1234"),
   209  	}
   210  
   211  	b := []ma.Multiaddr{
   212  		newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234"),
   213  		newMultiaddr(t, "/ip6/::1/tcp/1234"),
   214  		newMultiaddr(t, "/ip6/fe80::1/tcp/1234"),
   215  	}
   216  
   217  	c1 := []ma.Multiaddr{
   218  		newMultiaddr(t, "/ip4/0.0.0.0/tcp/1234"),
   219  		newMultiaddr(t, "/ip6/::/tcp/1234"),
   220  		newMultiaddr(t, "/ip6/fe80::/tcp/1234"),
   221  	}
   222  
   223  	c2 := Subtract(a, b)
   224  	if len(c1) != len(c2) {
   225  		t.Error("should be the same")
   226  	}
   227  	for i, ca := range c1 {
   228  		if !c2[i].Equal(ca) {
   229  			t.Error("should be the same", ca, c2[i])
   230  		}
   231  	}
   232  }