mirror of
https://github.com/libp2p/go-libp2p.git
synced 2025-10-17 13:40:49 +08:00
233 lines
5.3 KiB
Go
233 lines
5.3 KiB
Go
package addrutil
|
|
|
|
import (
|
|
"testing"
|
|
|
|
ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr"
|
|
manet "gx/ipfs/QmYtzQmUwPFGxjCXctJ8e6GXS8sYfoXy2pdeMbS5SFWqRi/go-multiaddr-net"
|
|
)
|
|
|
|
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])
|
|
}
|
|
}
|
|
}
|