tendermint/p2p/pex_reactor_test.go

200 lines
5.0 KiB
Go
Raw Normal View History

2017-01-12 00:17:15 +04:00
package p2p
import (
"fmt"
2017-01-16 20:31:50 +04:00
"io/ioutil"
2017-01-12 00:17:15 +04:00
"math/rand"
2017-01-16 20:31:50 +04:00
"os"
2017-01-12 00:17:15 +04:00
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2017-01-12 15:16:51 +04:00
wire "github.com/tendermint/go-wire"
2017-05-01 22:05:26 -04:00
cmn "github.com/tendermint/tmlibs/common"
2017-05-02 11:53:32 +04:00
"github.com/tendermint/tmlibs/log"
2017-01-12 00:17:15 +04:00
)
func TestPEXReactorBasic(t *testing.T) {
2017-04-20 13:04:40 +04:00
assert, require := assert.New(t), require.New(t)
2017-01-16 20:31:50 +04:00
dir, err := ioutil.TempDir("", "pex_reactor")
2017-04-20 13:04:40 +04:00
require.Nil(err)
2017-01-16 20:31:50 +04:00
defer os.RemoveAll(dir)
book := NewAddrBook(dir+"addrbook.json", true)
2017-05-02 11:53:32 +04:00
book.SetLogger(log.TestingLogger())
2017-01-16 20:31:50 +04:00
2017-01-12 00:17:15 +04:00
r := NewPEXReactor(book)
2017-05-02 11:53:32 +04:00
r.SetLogger(log.TestingLogger())
2017-01-12 00:17:15 +04:00
2017-04-20 13:04:40 +04:00
assert.NotNil(r)
assert.NotEmpty(r.GetChannels())
2017-01-12 00:17:15 +04:00
}
func TestPEXReactorAddRemovePeer(t *testing.T) {
2017-04-20 13:04:40 +04:00
assert, require := assert.New(t), require.New(t)
2017-01-16 20:31:50 +04:00
dir, err := ioutil.TempDir("", "pex_reactor")
2017-04-20 13:04:40 +04:00
require.Nil(err)
2017-01-16 20:31:50 +04:00
defer os.RemoveAll(dir)
book := NewAddrBook(dir+"addrbook.json", true)
2017-05-02 11:53:32 +04:00
book.SetLogger(log.TestingLogger())
2017-01-16 20:31:50 +04:00
2017-01-12 00:17:15 +04:00
r := NewPEXReactor(book)
2017-05-02 11:53:32 +04:00
r.SetLogger(log.TestingLogger())
2017-01-12 00:17:15 +04:00
size := book.Size()
peer := createRandomPeer(false)
r.AddPeer(peer)
2017-04-20 13:04:40 +04:00
assert.Equal(size+1, book.Size())
2017-01-12 00:17:15 +04:00
r.RemovePeer(peer, "peer not available")
2017-04-20 13:04:40 +04:00
assert.Equal(size+1, book.Size())
2017-01-12 00:17:15 +04:00
outboundPeer := createRandomPeer(true)
r.AddPeer(outboundPeer)
2017-04-20 13:04:40 +04:00
assert.Equal(size+1, book.Size(), "outbound peers should not be added to the address book")
2017-01-12 00:17:15 +04:00
r.RemovePeer(outboundPeer, "peer not available")
2017-04-20 13:04:40 +04:00
assert.Equal(size+1, book.Size())
2017-01-12 00:17:15 +04:00
}
func TestPEXReactorRunning(t *testing.T) {
2017-04-20 13:04:40 +04:00
require := require.New(t)
2017-01-12 00:17:15 +04:00
N := 3
switches := make([]*Switch, N)
2017-01-16 20:31:50 +04:00
dir, err := ioutil.TempDir("", "pex_reactor")
2017-04-20 13:04:40 +04:00
require.Nil(err)
2017-01-16 20:31:50 +04:00
defer os.RemoveAll(dir)
book := NewAddrBook(dir+"addrbook.json", false)
2017-05-02 11:53:32 +04:00
book.SetLogger(log.TestingLogger())
2017-01-12 00:17:15 +04:00
// create switches
for i := 0; i < N; i++ {
2017-05-01 22:05:26 -04:00
switches[i] = makeSwitch(config, i, "127.0.0.1", "123.123.123", func(i int, sw *Switch) *Switch {
sw.SetLogger(log.TestingLogger().With("switch", i))
2017-01-12 00:17:15 +04:00
r := NewPEXReactor(book)
2017-05-02 11:53:32 +04:00
r.SetLogger(log.TestingLogger())
2017-01-12 00:17:15 +04:00
r.SetEnsurePeersPeriod(250 * time.Millisecond)
sw.AddReactor("pex", r)
return sw
})
}
// fill the address book and add listeners
for _, s := range switches {
2017-04-14 23:59:22 +04:00
addr, _ := NewNetAddressString(s.NodeInfo().ListenAddr)
2017-01-12 00:17:15 +04:00
book.AddAddress(addr, addr)
2017-05-02 11:53:32 +04:00
s.AddListener(NewDefaultListener("tcp", s.NodeInfo().ListenAddr, true, log.TestingLogger()))
2017-01-12 00:17:15 +04:00
}
// start switches
for _, s := range switches {
_, err := s.Start() // start switch and reactors
2017-04-20 13:04:40 +04:00
require.Nil(err)
2017-01-12 00:17:15 +04:00
}
assertSomePeersWithTimeout(t, switches, 10*time.Millisecond, 10*time.Second)
2017-01-12 00:17:15 +04:00
// stop them
for _, s := range switches {
s.Stop()
}
}
func assertSomePeersWithTimeout(t *testing.T, switches []*Switch, checkPeriod, timeout time.Duration) {
ticker := time.NewTicker(checkPeriod)
2017-11-07 18:08:45 -05:00
for {
select {
case <-ticker.C:
// check peers are connected
allGood := true
for _, s := range switches {
outbound, inbound, _ := s.NumPeers()
if outbound+inbound == 0 {
allGood = false
}
}
2017-11-07 18:08:45 -05:00
if allGood {
return
}
case <-time.After(timeout):
numPeersStr := ""
for i, s := range switches {
outbound, inbound, _ := s.NumPeers()
numPeersStr += fmt.Sprintf("%d => {outbound: %d, inbound: %d}, ", i, outbound, inbound)
}
t.Errorf("expected all switches to be connected to at least one peer (switches: %s)", numPeersStr)
}
}
}
2017-01-12 15:16:51 +04:00
func TestPEXReactorReceive(t *testing.T) {
2017-04-20 13:04:40 +04:00
assert, require := assert.New(t), require.New(t)
2017-01-16 20:31:50 +04:00
dir, err := ioutil.TempDir("", "pex_reactor")
2017-04-20 13:04:40 +04:00
require.Nil(err)
2017-01-16 20:31:50 +04:00
defer os.RemoveAll(dir)
2017-09-05 17:10:11 -04:00
book := NewAddrBook(dir+"addrbook.json", false)
2017-05-02 11:53:32 +04:00
book.SetLogger(log.TestingLogger())
2017-01-16 20:31:50 +04:00
2017-01-12 15:16:51 +04:00
r := NewPEXReactor(book)
2017-05-02 11:53:32 +04:00
r.SetLogger(log.TestingLogger())
2017-01-12 15:16:51 +04:00
peer := createRandomPeer(false)
size := book.Size()
2017-09-12 20:49:22 -04:00
netAddr, _ := NewNetAddressString(peer.NodeInfo().ListenAddr)
2017-04-14 23:59:22 +04:00
addrs := []*NetAddress{netAddr}
2017-01-12 15:16:51 +04:00
msg := wire.BinaryBytes(struct{ PexMessage }{&pexAddrsMessage{Addrs: addrs}})
r.Receive(PexChannel, peer, msg)
2017-04-20 13:04:40 +04:00
assert.Equal(size+1, book.Size())
2017-01-12 15:16:51 +04:00
msg = wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
r.Receive(PexChannel, peer, msg)
}
2017-01-12 17:56:40 +04:00
func TestPEXReactorAbuseFromPeer(t *testing.T) {
2017-04-20 13:04:40 +04:00
assert, require := assert.New(t), require.New(t)
2017-01-16 20:31:50 +04:00
dir, err := ioutil.TempDir("", "pex_reactor")
2017-04-20 13:04:40 +04:00
require.Nil(err)
2017-01-16 20:31:50 +04:00
defer os.RemoveAll(dir)
book := NewAddrBook(dir+"addrbook.json", true)
2017-05-02 11:53:32 +04:00
book.SetLogger(log.TestingLogger())
2017-01-16 20:31:50 +04:00
2017-01-12 17:56:40 +04:00
r := NewPEXReactor(book)
2017-05-02 11:53:32 +04:00
r.SetLogger(log.TestingLogger())
2017-01-12 17:56:40 +04:00
r.SetMaxMsgCountByPeer(5)
peer := createRandomPeer(false)
msg := wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
for i := 0; i < 10; i++ {
r.Receive(PexChannel, peer, msg)
}
2017-09-12 20:49:22 -04:00
assert.True(r.ReachedMaxMsgCountForPeer(peer.NodeInfo().ListenAddr))
2017-01-12 17:56:40 +04:00
}
2017-09-12 20:49:22 -04:00
func createRandomPeer(outbound bool) *peer {
2017-01-16 20:31:50 +04:00
addr := cmn.Fmt("%v.%v.%v.%v:46656", rand.Int()%256, rand.Int()%256, rand.Int()%256, rand.Int()%256)
2017-04-14 23:59:22 +04:00
netAddr, _ := NewNetAddressString(addr)
2017-09-12 20:49:22 -04:00
p := &peer{
key: cmn.RandStr(12),
nodeInfo: &NodeInfo{
2017-01-12 15:16:51 +04:00
ListenAddr: addr,
2017-09-12 20:49:22 -04:00
RemoteAddr: netAddr.String(),
2017-01-12 00:17:15 +04:00
},
outbound: outbound,
2017-04-14 23:59:22 +04:00
mconn: &MConnection{RemoteAddress: netAddr},
2017-01-12 00:17:15 +04:00
}
2017-05-12 19:17:08 +02:00
p.SetLogger(log.TestingLogger().With("peer", addr))
return p
2017-01-12 00:17:15 +04:00
}