tendermint/pex_reactor_test.go

152 lines
3.6 KiB
Go
Raw Normal View History

2017-01-11 12:17:15 -08:00
package p2p
import (
2017-01-16 08:31:50 -08:00
"io/ioutil"
2017-01-11 12:17:15 -08:00
"math/rand"
2017-01-16 08:31:50 -08:00
"os"
2017-01-11 12:17:15 -08:00
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2017-01-16 08:31:50 -08:00
cmn "github.com/tendermint/go-common"
2017-01-12 03:16:51 -08:00
wire "github.com/tendermint/go-wire"
2017-01-11 12:17:15 -08:00
)
func TestPEXReactorBasic(t *testing.T) {
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
require.Nil(t, err)
defer os.RemoveAll(dir)
book := NewAddrBook(dir+"addrbook.json", true)
2017-01-11 12:17:15 -08:00
r := NewPEXReactor(book)
assert.NotNil(t, r)
assert.NotEmpty(t, r.GetChannels())
}
func TestPEXReactorAddRemovePeer(t *testing.T) {
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
require.Nil(t, err)
defer os.RemoveAll(dir)
book := NewAddrBook(dir+"addrbook.json", true)
2017-01-11 12:17:15 -08:00
r := NewPEXReactor(book)
size := book.Size()
peer := createRandomPeer(false)
r.AddPeer(peer)
assert.Equal(t, size+1, book.Size())
r.RemovePeer(peer, "peer not available")
assert.Equal(t, size, book.Size())
outboundPeer := createRandomPeer(true)
r.AddPeer(outboundPeer)
assert.Equal(t, size, book.Size(), "size must not change")
r.RemovePeer(outboundPeer, "peer not available")
assert.Equal(t, size, book.Size(), "size must not change")
}
func TestPEXReactorRunning(t *testing.T) {
N := 3
switches := make([]*Switch, N)
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
require.Nil(t, err)
defer os.RemoveAll(dir)
book := NewAddrBook(dir+"addrbook.json", false)
2017-01-11 12:17:15 -08:00
// create switches
for i := 0; i < N; i++ {
2017-01-16 08:31:50 -08:00
switches[i] = makeSwitch(i, "127.0.0.1", "123.123.123", func(i int, sw *Switch) *Switch {
2017-01-11 12:17:15 -08:00
r := NewPEXReactor(book)
r.SetEnsurePeersPeriod(250 * time.Millisecond)
sw.AddReactor("pex", r)
return sw
})
}
// fill the address book and add listeners
for _, s := range switches {
addr := NewNetAddressString(s.NodeInfo().ListenAddr)
book.AddAddress(addr, addr)
s.AddListener(NewDefaultListener("tcp", s.NodeInfo().ListenAddr, true))
}
// start switches
for _, s := range switches {
_, err := s.Start() // start switch and reactors
require.Nil(t, err)
}
time.Sleep(1 * time.Second)
// check peers are connected after some time
for _, s := range switches {
outbound, inbound, _ := s.NumPeers()
if outbound+inbound == 0 {
t.Errorf("%v expected to be connected to at least one peer", s.NodeInfo().ListenAddr)
}
}
// stop them
for _, s := range switches {
s.Stop()
}
}
2017-01-12 03:16:51 -08:00
func TestPEXReactorReceive(t *testing.T) {
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
require.Nil(t, err)
defer os.RemoveAll(dir)
book := NewAddrBook(dir+"addrbook.json", true)
2017-01-12 03:16:51 -08:00
r := NewPEXReactor(book)
peer := createRandomPeer(false)
size := book.Size()
addrs := []*NetAddress{NewNetAddressString(peer.ListenAddr)}
msg := wire.BinaryBytes(struct{ PexMessage }{&pexAddrsMessage{Addrs: addrs}})
r.Receive(PexChannel, peer, msg)
assert.Equal(t, size+1, book.Size())
msg = wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
r.Receive(PexChannel, peer, msg)
}
2017-01-12 05:56:40 -08:00
func TestPEXReactorAbuseFromPeer(t *testing.T) {
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
require.Nil(t, err)
defer os.RemoveAll(dir)
book := NewAddrBook(dir+"addrbook.json", true)
2017-01-12 05:56:40 -08:00
r := NewPEXReactor(book)
r.SetMaxMsgCountByPeer(5)
peer := createRandomPeer(false)
msg := wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
for i := 0; i < 10; i++ {
r.Receive(PexChannel, peer, msg)
}
assert.True(t, r.ReachedMaxMsgCountForPeer(peer.ListenAddr))
}
2017-01-11 12:17:15 -08:00
func createRandomPeer(outbound bool) *Peer {
2017-01-16 08:31:50 -08:00
addr := cmn.Fmt("%v.%v.%v.%v:46656", rand.Int()%256, rand.Int()%256, rand.Int()%256, rand.Int()%256)
2017-01-11 12:17:15 -08:00
return &Peer{
2017-01-16 08:31:50 -08:00
Key: cmn.RandStr(12),
2017-01-11 12:17:15 -08:00
NodeInfo: &NodeInfo{
2017-01-12 03:16:51 -08:00
ListenAddr: addr,
2017-01-11 12:17:15 -08:00
},
outbound: outbound,
2017-01-12 03:16:51 -08:00
mconn: &MConnection{RemoteAddress: NewNetAddressString(addr)},
2017-01-11 12:17:15 -08:00
}
}