2014-11-05 00:38:21 -08:00
|
|
|
package manet
|
2014-10-11 02:28:32 -07:00
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"net"
|
|
|
|
"sync"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
ma "github.com/jbenet/go-multiaddr"
|
|
|
|
)
|
|
|
|
|
|
|
|
func newMultiaddr(t *testing.T, m string) ma.Multiaddr {
|
|
|
|
maddr, err := ma.NewMultiaddr(m)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("failed to construct multiaddr: %s", m)
|
|
|
|
}
|
|
|
|
return maddr
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDial(t *testing.T) {
|
|
|
|
|
|
|
|
listener, err := net.Listen("tcp", "127.0.0.1:4321")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to listen")
|
|
|
|
}
|
|
|
|
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
wg.Add(1)
|
|
|
|
go func() {
|
|
|
|
|
|
|
|
cB, err := listener.Accept()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to accept")
|
|
|
|
}
|
|
|
|
|
|
|
|
// echo out
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
for {
|
|
|
|
_, err := cB.Read(buf)
|
|
|
|
if err != nil {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
cB.Write(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
wg.Done()
|
|
|
|
}()
|
|
|
|
|
|
|
|
maddr := newMultiaddr(t, "/ip4/127.0.0.1/tcp/4321")
|
|
|
|
cA, err := Dial(maddr)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to dial")
|
|
|
|
}
|
|
|
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
if _, err := cA.Write([]byte("beep boop")); err != nil {
|
|
|
|
t.Fatal("failed to write:", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := cA.Read(buf); err != nil {
|
|
|
|
t.Fatal("failed to read:", buf, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !bytes.Equal(buf[:9], []byte("beep boop")) {
|
|
|
|
t.Fatal("failed to echo:", buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
maddr2 := cA.RemoteMultiaddr()
|
|
|
|
if !maddr2.Equal(maddr) {
|
|
|
|
t.Fatal("remote multiaddr not equal:", maddr, maddr2)
|
|
|
|
}
|
|
|
|
|
|
|
|
cA.Close()
|
|
|
|
wg.Wait()
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListen(t *testing.T) {
|
|
|
|
|
|
|
|
maddr := newMultiaddr(t, "/ip4/127.0.0.1/tcp/4322")
|
|
|
|
listener, err := Listen(maddr)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to listen")
|
|
|
|
}
|
|
|
|
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
wg.Add(1)
|
|
|
|
go func() {
|
|
|
|
|
|
|
|
cB, err := listener.Accept()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to accept")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !cB.LocalMultiaddr().Equal(maddr) {
|
|
|
|
t.Fatal("local multiaddr not equal:", maddr, cB.LocalMultiaddr())
|
|
|
|
}
|
|
|
|
|
|
|
|
// echo out
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
for {
|
|
|
|
_, err := cB.Read(buf)
|
|
|
|
if err != nil {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
cB.Write(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
wg.Done()
|
|
|
|
}()
|
|
|
|
|
|
|
|
cA, err := net.Dial("tcp", "127.0.0.1:4322")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to dial")
|
|
|
|
}
|
|
|
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
if _, err := cA.Write([]byte("beep boop")); err != nil {
|
|
|
|
t.Fatal("failed to write:", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := cA.Read(buf); err != nil {
|
|
|
|
t.Fatal("failed to read:", buf, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !bytes.Equal(buf[:9], []byte("beep boop")) {
|
|
|
|
t.Fatal("failed to echo:", buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
maddr2, err := FromNetAddr(cA.RemoteAddr())
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to convert", err)
|
|
|
|
}
|
|
|
|
if !maddr2.Equal(maddr) {
|
|
|
|
t.Fatal("remote multiaddr not equal:", maddr, maddr2)
|
|
|
|
}
|
|
|
|
|
|
|
|
cA.Close()
|
|
|
|
wg.Wait()
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListenAndDial(t *testing.T) {
|
|
|
|
|
|
|
|
maddr := newMultiaddr(t, "/ip4/127.0.0.1/tcp/4323")
|
|
|
|
listener, err := Listen(maddr)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to listen")
|
|
|
|
}
|
|
|
|
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
wg.Add(1)
|
|
|
|
go func() {
|
|
|
|
|
|
|
|
cB, err := listener.Accept()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to accept")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !cB.LocalMultiaddr().Equal(maddr) {
|
|
|
|
t.Fatal("local multiaddr not equal:", maddr, cB.LocalMultiaddr())
|
|
|
|
}
|
|
|
|
|
|
|
|
// echo out
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
for {
|
|
|
|
_, err := cB.Read(buf)
|
|
|
|
if err != nil {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
cB.Write(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
wg.Done()
|
|
|
|
}()
|
|
|
|
|
|
|
|
cA, err := Dial(newMultiaddr(t, "/ip4/127.0.0.1/tcp/4323"))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("failed to dial")
|
|
|
|
}
|
|
|
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
if _, err := cA.Write([]byte("beep boop")); err != nil {
|
|
|
|
t.Fatal("failed to write:", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := cA.Read(buf); err != nil {
|
|
|
|
t.Fatal("failed to read:", buf, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !bytes.Equal(buf[:9], []byte("beep boop")) {
|
|
|
|
t.Fatal("failed to echo:", buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
maddr2 := cA.RemoteMultiaddr()
|
|
|
|
if !maddr2.Equal(maddr) {
|
|
|
|
t.Fatal("remote multiaddr not equal:", maddr, maddr2)
|
|
|
|
}
|
|
|
|
|
|
|
|
cA.Close()
|
|
|
|
wg.Wait()
|
|
|
|
}
|
2014-11-05 00:04:30 -08:00
|
|
|
|
|
|
|
func TestLoopback(t *testing.T) {
|
|
|
|
if IP4Loopback.String() != "/ip4/127.0.0.1" {
|
|
|
|
t.Error("IP4Loopback incorrect:", IP4Loopback)
|
|
|
|
}
|
|
|
|
|
|
|
|
if IP6Loopback.String() != "/ip6/::1" {
|
|
|
|
t.Error("IP6Loopback incorrect:", IP6Loopback)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !IsIPLoopback(IP4Loopback) {
|
|
|
|
t.Error("IsIPLoopback failed (IP4)")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !IsIPLoopback(IP6Loopback) {
|
|
|
|
t.Error("IsIPLoopback failed (IP6)")
|
|
|
|
}
|
|
|
|
}
|