dht_test.go 5.55 KB
Newer Older
1 2 3 4
package dht

import (
	"testing"
5

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
6 7
	context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"

8 9
	ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go"
	ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
10

11
	ci "github.com/jbenet/go-ipfs/crypto"
12
	spipe "github.com/jbenet/go-ipfs/crypto/spipe"
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
13 14 15
	inet "github.com/jbenet/go-ipfs/net"
	mux "github.com/jbenet/go-ipfs/net/mux"
	netservice "github.com/jbenet/go-ipfs/net/service"
16 17 18
	peer "github.com/jbenet/go-ipfs/peer"
	u "github.com/jbenet/go-ipfs/util"

Siraj Ravel's avatar
Siraj Ravel committed
19
	"bytes"
20
	"fmt"
21
	"time"
22 23
)

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT {
	ctx := context.TODO()

	peerstore := peer.NewPeerstore()

	ctx, _ = context.WithCancel(ctx)
	dhts := netservice.NewService(nil) // nil handler for now, need to patch it
	if err := dhts.Start(ctx); err != nil {
		t.Fatal(err)
	}

	net, err := inet.NewIpfsNetwork(context.TODO(), p, &mux.ProtocolMap{
		mux.ProtocolID_Routing: dhts,
	})
	if err != nil {
		t.Fatal(err)
	}

	d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore())
	dhts.Handler = d
	d.Start()
	return d
}

48 49 50 51 52 53 54 55 56 57 58 59 60 61
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])
62
		sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512)
63 64 65
		if err != nil {
			panic(err)
		}
66 67
		p.PubKey = pk
		p.PrivKey = sk
68
		id, err := spipe.IDFromPubKey(pk)
69 70 71 72
		if err != nil {
			panic(err)
		}
		p.ID = id
73 74 75 76 77
		peers = append(peers, p)
	}

	var dhts []*IpfsDHT
	for i := 0; i < 4; i++ {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
78
		dhts[i] = setupDHT(t, peers[i])
79 80 81 82 83
	}

	return addrs, peers, dhts
}

84 85 86
func makePeer(addr *ma.Multiaddr) *peer.Peer {
	p := new(peer.Peer)
	p.AddAddress(addr)
87
	sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512)
88 89 90
	if err != nil {
		panic(err)
	}
91 92
	p.PrivKey = sk
	p.PubKey = pk
93
	id, err := spipe.IDFromPubKey(pk)
94 95 96 97 98 99 100 101
	if err != nil {
		panic(err)
	}

	p.ID = id
	return p
}

102
func TestPing(t *testing.T) {
103
	u.Debug = true
104
	addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222")
105 106 107
	if err != nil {
		t.Fatal(err)
	}
108
	addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678")
109 110 111 112
	if err != nil {
		t.Fatal(err)
	}

113 114
	peerA := makePeer(addrA)
	peerB := makePeer(addrB)
115

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
116 117
	dhtA := setupDHT(t, peerA)
	dhtB := setupDHT(t, peerB)
118

119 120
	dhtA.Start()
	dhtB.Start()
Jeromy's avatar
Jeromy committed
121 122
	defer dhtA.Halt()
	defer dhtB.Halt()
123

124
	_, err = dhtA.Connect(addrB)
125 126 127 128 129
	if err != nil {
		t.Fatal(err)
	}

	//Test that we can ping the node
130
	err = dhtA.Ping(peerB, time.Second*2)
131 132 133
	if err != nil {
		t.Fatal(err)
	}
134 135 136 137
}

func TestValueGetSet(t *testing.T) {
	u.Debug = false
138
	addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235")
139 140 141
	if err != nil {
		t.Fatal(err)
	}
142
	addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679")
143 144 145 146
	if err != nil {
		t.Fatal(err)
	}

147 148
	peerA := makePeer(addrA)
	peerB := makePeer(addrB)
149

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
150 151
	dhtA := setupDHT(t, peerA)
	dhtB := setupDHT(t, peerB)
152

153 154
	dhtA.Start()
	dhtB.Start()
Jeromy's avatar
Jeromy committed
155 156
	defer dhtA.Halt()
	defer dhtB.Halt()
157

158
	_, err = dhtA.Connect(addrB)
159 160 161 162
	if err != nil {
		t.Fatal(err)
	}

163
	dhtA.PutValue("hello", []byte("world"))
164

165
	val, err := dhtA.GetValue("hello", time.Second*2)
166 167 168 169 170
	if err != nil {
		t.Fatal(err)
	}

	if string(val) != "world" {
Jeromy's avatar
Jeromy committed
171
		t.Fatalf("Expected 'world' got '%s'", string(val))
172
	}
Siraj Ravel's avatar
Siraj Ravel committed
173

174
}
175 176 177

func TestProvides(t *testing.T) {
	u.Debug = false
178 179

	addrs, _, dhts := setupDHTS(4, t)
Jeromy's avatar
Jeromy committed
180 181 182 183 184
	defer func() {
		for i := 0; i < 4; i++ {
			dhts[i].Halt()
		}
	}()
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

	_, 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)
	}

Chas Leichner's avatar
Chas Leichner committed
201
	err = dhts[3].putLocal(u.Key("hello"), []byte("world"))
202 203 204 205
	if err != nil {
		t.Fatal(err)
	}

Siraj Ravel's avatar
Siraj Ravel committed
206 207
	bits, err := dhts[3].getLocal(u.Key("hello"))
	if err != nil && bytes.Equal(bits, []byte("world")) {
Siraj Ravel's avatar
Siraj Ravel committed
208 209 210
		t.Fatal(err)
	}

211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
	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")
	}
}

func TestLayeredGet(t *testing.T) {
	u.Debug = false
230
	addrs, _, dhts := setupDHTS(4, t)
Jeromy's avatar
Jeromy committed
231 232 233 234 235
	defer func() {
		for i := 0; i < 4; i++ {
			dhts[i].Halt()
		}
	}()
236 237 238

	_, err := dhts[0].Connect(addrs[1])
	if err != nil {
239
		t.Fatalf("Failed to connect: %s", err)
240 241 242 243 244 245 246 247 248 249 250 251
	}

	_, err = dhts[1].Connect(addrs[2])
	if err != nil {
		t.Fatal(err)
	}

	_, err = dhts[1].Connect(addrs[3])
	if err != nil {
		t.Fatal(err)
	}

Chas Leichner's avatar
Chas Leichner committed
252
	err = dhts[3].putLocal(u.Key("hello"), []byte("world"))
253 254 255 256 257 258 259 260 261 262 263
	if err != nil {
		t.Fatal(err)
	}

	err = dhts[3].Provide(u.Key("hello"))
	if err != nil {
		t.Fatal(err)
	}

	time.Sleep(time.Millisecond * 60)

264
	val, err := dhts[0].GetValue(u.Key("hello"), time.Second)
265 266 267 268
	if err != nil {
		t.Fatal(err)
	}

269 270
	if string(val) != "world" {
		t.Fatal("Got incorrect value.")
271 272
	}

273
}
Jeromy's avatar
Jeromy committed
274

275
func TestFindPeer(t *testing.T) {
Jeromy's avatar
Jeromy committed
276 277
	u.Debug = false

278
	addrs, peers, dhts := setupDHTS(4, t)
279
	defer func() {
Jeromy's avatar
Jeromy committed
280 281 282 283
		for i := 0; i < 4; i++ {
			dhts[i].Halt()
		}
	}()
Jeromy's avatar
Jeromy committed
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299

	_, 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)
	}

300
	p, err := dhts[0].FindPeer(peers[2].ID, time.Second)
Jeromy's avatar
Jeromy committed
301 302 303 304
	if err != nil {
		t.Fatal(err)
	}

305 306
	if p == nil {
		t.Fatal("Failed to find peer.")
Jeromy's avatar
Jeromy committed
307 308
	}

309 310
	if !p.ID.Equal(peers[2].ID) {
		t.Fatal("Didnt find expected peer.")
Jeromy's avatar
Jeromy committed
311 312
	}
}