2014-08-01 13:21:51 -07:00
|
|
|
package dht
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
2014-08-08 18:09:21 -07:00
|
|
|
|
2014-08-01 13:21:51 -07:00
|
|
|
peer "github.com/jbenet/go-ipfs/peer"
|
2014-08-10 21:40:17 -07:00
|
|
|
swarm "github.com/jbenet/go-ipfs/swarm"
|
2014-08-01 13:21:51 -07:00
|
|
|
u "github.com/jbenet/go-ipfs/util"
|
2014-08-08 18:09:21 -07:00
|
|
|
ma "github.com/jbenet/go-multiaddr"
|
2014-08-01 13:21:51 -07:00
|
|
|
|
2014-08-07 21:52:11 -07:00
|
|
|
"fmt"
|
2014-08-08 18:09:21 -07:00
|
|
|
"time"
|
2014-08-01 13:21:51 -07:00
|
|
|
)
|
|
|
|
|
2014-08-10 21:02:05 -07:00
|
|
|
func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) {
|
|
|
|
var addrs []*ma.Multiaddr
|
|
|
|
for i := 0; i < 4; i++ {
|
|
|
|
a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
addrs = append(addrs, a)
|
|
|
|
}
|
|
|
|
|
|
|
|
var peers []*peer.Peer
|
|
|
|
for i := 0; i < 4; i++ {
|
|
|
|
p := new(peer.Peer)
|
|
|
|
p.AddAddress(addrs[i])
|
|
|
|
p.ID = peer.ID([]byte(fmt.Sprintf("peer_%d", i)))
|
|
|
|
peers = append(peers, p)
|
|
|
|
}
|
|
|
|
|
|
|
|
var dhts []*IpfsDHT
|
|
|
|
for i := 0; i < 4; i++ {
|
2014-08-10 21:40:17 -07:00
|
|
|
net := swarm.NewSwarm(peers[i])
|
|
|
|
err := net.Listen()
|
2014-08-10 21:02:05 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2014-08-10 21:40:17 -07:00
|
|
|
d := NewDHT(peers[i], net)
|
2014-08-10 21:02:05 -07:00
|
|
|
dhts = append(dhts, d)
|
|
|
|
d.Start()
|
|
|
|
}
|
|
|
|
|
|
|
|
return addrs, peers, dhts
|
|
|
|
}
|
|
|
|
|
2014-08-01 13:21:51 -07:00
|
|
|
func TestPing(t *testing.T) {
|
|
|
|
u.Debug = false
|
2014-08-08 19:49:27 -07:00
|
|
|
addr_a, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222")
|
2014-08-01 13:21:51 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2014-08-08 18:09:21 -07:00
|
|
|
addr_b, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678")
|
2014-08-01 13:21:51 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
peer_a := new(peer.Peer)
|
|
|
|
peer_a.AddAddress(addr_a)
|
|
|
|
peer_a.ID = peer.ID([]byte("peer_a"))
|
|
|
|
|
|
|
|
peer_b := new(peer.Peer)
|
|
|
|
peer_b.AddAddress(addr_b)
|
|
|
|
peer_b.ID = peer.ID([]byte("peer_b"))
|
|
|
|
|
2014-08-10 21:40:17 -07:00
|
|
|
neta := swarm.NewSwarm(peer_a)
|
|
|
|
err = neta.Listen()
|
2014-08-01 13:21:51 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2014-08-10 21:40:17 -07:00
|
|
|
dht_a := NewDHT(peer_a, neta)
|
2014-08-01 13:21:51 -07:00
|
|
|
|
2014-08-10 21:40:17 -07:00
|
|
|
netb := swarm.NewSwarm(peer_b)
|
|
|
|
err = netb.Listen()
|
2014-08-01 13:21:51 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2014-08-10 21:40:17 -07:00
|
|
|
dht_b := NewDHT(peer_b, netb)
|
2014-08-01 13:21:51 -07:00
|
|
|
|
|
|
|
dht_a.Start()
|
|
|
|
dht_b.Start()
|
|
|
|
|
2014-08-08 18:09:21 -07:00
|
|
|
_, err = dht_a.Connect(addr_b)
|
2014-08-01 13:21:51 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
//Test that we can ping the node
|
2014-08-08 18:09:21 -07:00
|
|
|
err = dht_a.Ping(peer_b, time.Second*2)
|
2014-08-01 13:21:51 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2014-08-03 17:35:12 -07:00
|
|
|
|
|
|
|
dht_a.Halt()
|
|
|
|
dht_b.Halt()
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestValueGetSet(t *testing.T) {
|
|
|
|
u.Debug = false
|
2014-08-08 18:09:21 -07:00
|
|
|
addr_a, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235")
|
2014-08-03 17:35:12 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2014-08-08 18:09:21 -07:00
|
|
|
addr_b, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679")
|
2014-08-03 17:35:12 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
peer_a := new(peer.Peer)
|
|
|
|
peer_a.AddAddress(addr_a)
|
|
|
|
peer_a.ID = peer.ID([]byte("peer_a"))
|
|
|
|
|
|
|
|
peer_b := new(peer.Peer)
|
|
|
|
peer_b.AddAddress(addr_b)
|
|
|
|
peer_b.ID = peer.ID([]byte("peer_b"))
|
|
|
|
|
2014-08-10 21:40:17 -07:00
|
|
|
neta := swarm.NewSwarm(peer_a)
|
|
|
|
err = neta.Listen()
|
2014-08-03 17:35:12 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2014-08-10 21:40:17 -07:00
|
|
|
dht_a := NewDHT(peer_a, neta)
|
2014-08-03 17:35:12 -07:00
|
|
|
|
2014-08-10 21:40:17 -07:00
|
|
|
netb := swarm.NewSwarm(peer_b)
|
|
|
|
err = netb.Listen()
|
2014-08-03 17:35:12 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2014-08-10 21:40:17 -07:00
|
|
|
dht_b := NewDHT(peer_b, netb)
|
2014-08-03 17:35:12 -07:00
|
|
|
|
|
|
|
dht_a.Start()
|
|
|
|
dht_b.Start()
|
|
|
|
|
2014-08-10 21:02:05 -07:00
|
|
|
errsa := dht_a.network.GetChan().Errors
|
|
|
|
errsb := dht_b.network.GetChan().Errors
|
2014-08-09 22:28:46 -07:00
|
|
|
go func() {
|
|
|
|
select {
|
2014-08-10 21:02:05 -07:00
|
|
|
case err := <-errsa:
|
2014-08-09 22:28:46 -07:00
|
|
|
t.Fatal(err)
|
2014-08-10 21:02:05 -07:00
|
|
|
case err := <-errsb:
|
2014-08-09 22:28:46 -07:00
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
2014-08-08 18:09:21 -07:00
|
|
|
_, err = dht_a.Connect(addr_b)
|
2014-08-03 17:35:12 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2014-08-09 22:28:46 -07:00
|
|
|
dht_a.PutValue("hello", []byte("world"))
|
2014-08-03 17:35:12 -07:00
|
|
|
|
2014-08-08 18:09:21 -07:00
|
|
|
val, err := dht_a.GetValue("hello", time.Second*2)
|
2014-08-03 17:35:12 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if string(val) != "world" {
|
|
|
|
t.Fatalf("Expected 'world' got %s", string(val))
|
|
|
|
}
|
2014-08-01 13:21:51 -07:00
|
|
|
}
|
2014-08-07 21:52:11 -07:00
|
|
|
|
|
|
|
func TestProvides(t *testing.T) {
|
|
|
|
u.Debug = false
|
2014-08-10 21:02:05 -07:00
|
|
|
|
|
|
|
addrs, _, dhts := setupDHTS(4, t)
|
|
|
|
|
|
|
|
_, err := dhts[0].Connect(addrs[1])
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = dhts[1].Connect(addrs[2])
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = dhts[1].Connect(addrs[3])
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = dhts[3].PutLocal(u.Key("hello"), []byte("world"))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = dhts[3].Provide(u.Key("hello"))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
time.Sleep(time.Millisecond * 60)
|
|
|
|
|
|
|
|
provs, err := dhts[0].FindProviders(u.Key("hello"), time.Second)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(provs) != 1 {
|
|
|
|
t.Fatal("Didnt get back providers")
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < 4; i++ {
|
|
|
|
dhts[i].Halt()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLayeredGet(t *testing.T) {
|
|
|
|
u.Debug = false
|
2014-08-10 21:40:17 -07:00
|
|
|
addrs,_,dhts := setupDHTS(4, t)
|
2014-08-07 21:52:11 -07:00
|
|
|
|
|
|
|
_, err := dhts[0].Connect(addrs[1])
|
|
|
|
if err != nil {
|
2014-08-10 21:02:05 -07:00
|
|
|
t.Fatalf("Failed to connect: %s", err)
|
2014-08-07 21:52:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
_, err = dhts[1].Connect(addrs[2])
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = dhts[1].Connect(addrs[3])
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = dhts[3].PutLocal(u.Key("hello"), []byte("world"))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = dhts[3].Provide(u.Key("hello"))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
time.Sleep(time.Millisecond * 60)
|
|
|
|
|
2014-08-10 21:02:05 -07:00
|
|
|
val, err := dhts[0].GetValue(u.Key("hello"), time.Second)
|
2014-08-07 21:52:11 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2014-08-10 21:02:05 -07:00
|
|
|
if string(val) != "world" {
|
|
|
|
t.Fatal("Got incorrect value.")
|
2014-08-07 21:52:11 -07:00
|
|
|
}
|
|
|
|
|
2014-08-08 18:09:21 -07:00
|
|
|
for i := 0; i < 4; i++ {
|
|
|
|
dhts[i].Halt()
|
|
|
|
}
|
|
|
|
}
|
2014-08-09 22:28:46 -07:00
|
|
|
|
2014-08-10 21:02:05 -07:00
|
|
|
func TestFindPeer(t *testing.T) {
|
2014-08-09 22:28:46 -07:00
|
|
|
u.Debug = false
|
|
|
|
|
2014-08-10 21:40:17 -07:00
|
|
|
addrs,peers,dhts := setupDHTS(4, t)
|
2014-08-09 22:28:46 -07:00
|
|
|
|
|
|
|
_, err := dhts[0].Connect(addrs[1])
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = dhts[1].Connect(addrs[2])
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = dhts[1].Connect(addrs[3])
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2014-08-10 21:02:05 -07:00
|
|
|
p, err := dhts[0].FindPeer(peers[2].ID, time.Second)
|
2014-08-09 22:28:46 -07:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2014-08-10 21:02:05 -07:00
|
|
|
if p == nil {
|
|
|
|
t.Fatal("Failed to find peer.")
|
2014-08-09 22:28:46 -07:00
|
|
|
}
|
|
|
|
|
2014-08-10 21:02:05 -07:00
|
|
|
if !p.ID.Equal(peers[2].ID) {
|
|
|
|
t.Fatal("Didnt find expected peer.")
|
2014-08-09 22:28:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < 4; i++ {
|
|
|
|
dhts[i].Halt()
|
|
|
|
}
|
|
|
|
}
|