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 }