diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 63a368b32..47f93e65f 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -92,6 +92,8 @@ func (dht *IpfsDHT) Start() { // Connect to a new peer at the given address // TODO: move this into swarm func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { + maddrstr,_ := addr.String() + u.DOut("Connect to new peer: %s", maddrstr) if addr == nil { panic("addr was nil!") } @@ -484,3 +486,15 @@ out: mes := swarm.NewMessage(p, resp.ToProtobuf()) dht.network.Chan.Outgoing <-mes } + +func (dht *IpfsDHT) GetLocal(key u.Key) ([]byte, error) { + v,err := dht.datastore.Get(ds.NewKey(string(key))) + if err != nil { + return nil, err + } + return v.([]byte), nil +} + +func (dht *IpfsDHT) PutLocal(key u.Key, value []byte) error { + return dht.datastore.Put(ds.NewKey(string(key)), value) +} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b57ca3f7b..2de027a3d 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -7,6 +7,7 @@ import ( u "github.com/jbenet/go-ipfs/util" "time" + "fmt" ) func TestPing(t *testing.T) { @@ -107,3 +108,72 @@ func TestValueGetSet(t *testing.T) { t.Fatalf("Expected 'world' got %s", string(val)) } } + +func TestProvides(t *testing.T) { + u.Debug = false + 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++ { + d,err := NewDHT(peers[i]) + if err != nil { + t.Fatal(err) + } + dhts = append(dhts, d) + d.Start() + } + + _, 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") + } +} + +