10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/require"
12 wire "github.com/tendermint/go-wire"
13 cmn "github.com/tendermint/tmlibs/common"
14 "github.com/tendermint/tmlibs/log"
17 func TestPEXReactorBasic(t *testing.T) {
18 assert, require := assert.New(t), require.New(t)
20 dir, err := ioutil.TempDir("", "pex_reactor")
22 defer os.RemoveAll(dir)
23 book := NewAddrBook(dir+"addrbook.json", true)
24 book.SetLogger(log.TestingLogger())
26 r := NewPEXReactor(book)
27 r.SetLogger(log.TestingLogger())
30 assert.NotEmpty(r.GetChannels())
33 func TestPEXReactorAddRemovePeer(t *testing.T) {
34 assert, require := assert.New(t), require.New(t)
36 dir, err := ioutil.TempDir("", "pex_reactor")
38 defer os.RemoveAll(dir)
39 book := NewAddrBook(dir+"addrbook.json", true)
40 book.SetLogger(log.TestingLogger())
42 r := NewPEXReactor(book)
43 r.SetLogger(log.TestingLogger())
46 peer := createRandomPeer(false)
49 assert.Equal(size+1, book.Size())
51 r.RemovePeer(peer, "peer not available")
52 assert.Equal(size+1, book.Size())
54 outboundPeer := createRandomPeer(true)
56 r.AddPeer(outboundPeer)
57 assert.Equal(size+1, book.Size(), "outbound peers should not be added to the address book")
59 r.RemovePeer(outboundPeer, "peer not available")
60 assert.Equal(size+1, book.Size())
63 func TestPEXReactorRunning(t *testing.T) {
64 require := require.New(t)
67 switches := make([]*Switch, N)
69 dir, err := ioutil.TempDir("", "pex_reactor")
71 defer os.RemoveAll(dir)
72 book := NewAddrBook(dir+"addrbook.json", false)
73 book.SetLogger(log.TestingLogger())
76 for i := 0; i < N; i++ {
77 switches[i] = makeSwitch(config, i, "127.0.0.1", "123.123.123", func(i int, sw *Switch) *Switch {
78 sw.SetLogger(log.TestingLogger().With("switch", i))
80 r := NewPEXReactor(book)
81 r.SetLogger(log.TestingLogger())
82 r.SetEnsurePeersPeriod(250 * time.Millisecond)
83 sw.AddReactor("pex", r)
88 // fill the address book and add listeners
89 for _, s := range switches {
90 addr, _ := NewNetAddressString(s.NodeInfo().ListenAddr)
91 book.AddAddress(addr, addr)
92 s.AddListener(NewDefaultListener("tcp", s.NodeInfo().ListenAddr, true, log.TestingLogger()))
96 for _, s := range switches {
97 _, err := s.Start() // start switch and reactors
101 time.Sleep(1 * time.Second)
103 // check peers are connected after some time
104 for _, s := range switches {
105 outbound, inbound, _ := s.NumPeers()
106 if outbound+inbound == 0 {
107 t.Errorf("%v expected to be connected to at least one peer", s.NodeInfo().ListenAddr)
112 for _, s := range switches {
117 func TestPEXReactorReceive(t *testing.T) {
118 assert, require := assert.New(t), require.New(t)
120 dir, err := ioutil.TempDir("", "pex_reactor")
122 defer os.RemoveAll(dir)
123 book := NewAddrBook(dir+"addrbook.json", true)
124 book.SetLogger(log.TestingLogger())
126 r := NewPEXReactor(book)
127 r.SetLogger(log.TestingLogger())
129 peer := createRandomPeer(false)
132 netAddr, _ := NewNetAddressString(peer.ListenAddr)
133 addrs := []*NetAddress{netAddr}
134 msg := wire.BinaryBytes(struct{ PexMessage }{&pexAddrsMessage{Addrs: addrs}})
135 r.Receive(PexChannel, peer, msg)
136 assert.Equal(size+1, book.Size())
138 msg = wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
139 r.Receive(PexChannel, peer, msg)
142 func TestPEXReactorAbuseFromPeer(t *testing.T) {
143 assert, require := assert.New(t), require.New(t)
145 dir, err := ioutil.TempDir("", "pex_reactor")
147 defer os.RemoveAll(dir)
148 book := NewAddrBook(dir+"addrbook.json", true)
149 book.SetLogger(log.TestingLogger())
151 r := NewPEXReactor(book)
152 r.SetLogger(log.TestingLogger())
153 r.SetMaxMsgCountByPeer(5)
155 peer := createRandomPeer(false)
157 msg := wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
158 for i := 0; i < 10; i++ {
159 r.Receive(PexChannel, peer, msg)
162 assert.True(r.ReachedMaxMsgCountForPeer(peer.ListenAddr))
165 func createRandomPeer(outbound bool) *Peer {
166 addr := cmn.Fmt("%v.%v.%v.%v:46656", rand.Int()%256, rand.Int()%256, rand.Int()%256, rand.Int()%256)
167 netAddr, _ := NewNetAddressString(addr)
169 Key: cmn.RandStr(12),
174 mconn: &MConnection{RemoteAddress: netAddr},
176 p.SetLogger(log.TestingLogger().With("peer", addr))