12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14 wire "github.com/tendermint/go-wire"
15 cmn "github.com/tendermint/tmlibs/common"
16 "github.com/tendermint/tmlibs/log"
19 func TestPEXReactorBasic(t *testing.T) {
20 assert, require := assert.New(t), require.New(t)
22 dir, err := ioutil.TempDir("", "pex_reactor")
24 defer os.RemoveAll(dir)
25 book := NewAddrBook(dir+"addrbook.json", true)
26 book.SetLogger(log.TestingLogger())
28 r := NewPEXReactor(book)
29 r.SetLogger(log.TestingLogger())
32 assert.NotEmpty(r.GetChannels())
35 func TestPEXReactorAddRemovePeer(t *testing.T) {
36 assert, require := assert.New(t), require.New(t)
38 dir, err := ioutil.TempDir("", "pex_reactor")
40 defer os.RemoveAll(dir)
41 book := NewAddrBook(dir+"addrbook.json", true)
42 book.SetLogger(log.TestingLogger())
44 r := NewPEXReactor(book)
45 r.SetLogger(log.TestingLogger())
48 peer := createRandomPeer(false)
51 assert.Equal(size+1, book.Size())
53 r.RemovePeer(peer, "peer not available")
54 assert.Equal(size+1, book.Size())
56 outboundPeer := createRandomPeer(true)
58 r.AddPeer(outboundPeer)
59 assert.Equal(size+1, book.Size(), "outbound peers should not be added to the address book")
61 r.RemovePeer(outboundPeer, "peer not available")
62 assert.Equal(size+1, book.Size())
65 func TestPEXReactorRunning(t *testing.T) {
66 require := require.New(t)
69 switches := make([]*Switch, N)
71 dir, err := ioutil.TempDir("", "pex_reactor")
73 defer os.RemoveAll(dir)
74 book := NewAddrBook(dir+"addrbook.json", false)
75 book.SetLogger(log.TestingLogger())
78 for i := 0; i < N; i++ {
79 switches[i] = makeSwitch(config, i, "127.0.0.1", "123.123.123", func(i int, sw *Switch) *Switch {
80 sw.SetLogger(log.TestingLogger().With("switch", i))
82 r := NewPEXReactor(book)
83 r.SetLogger(log.TestingLogger())
84 r.SetEnsurePeersPeriod(250 * time.Millisecond)
85 sw.AddReactor("pex", r)
90 // fill the address book and add listeners
91 for _, s := range switches {
92 addr, _ := NewNetAddressString(s.NodeInfo().ListenAddr)
93 book.AddAddress(addr, addr)
94 s.AddListener(NewDefaultListener("tcp", s.NodeInfo().ListenAddr, true, log.TestingLogger()))
98 for _, s := range switches {
99 _, err := s.Start() // start switch and reactors
103 time.Sleep(1 * time.Second)
105 // check peers are connected after some time
106 for _, s := range switches {
107 outbound, inbound, _ := s.NumPeers()
108 if outbound+inbound == 0 {
109 t.Errorf("%v expected to be connected to at least one peer", s.NodeInfo().ListenAddr)
114 for _, s := range switches {
119 func TestPEXReactorReceive(t *testing.T) {
120 assert, require := assert.New(t), require.New(t)
122 dir, err := ioutil.TempDir("", "pex_reactor")
124 defer os.RemoveAll(dir)
125 book := NewAddrBook(dir+"addrbook.json", true)
126 book.SetLogger(log.TestingLogger())
128 r := NewPEXReactor(book)
129 r.SetLogger(log.TestingLogger())
131 peer := createRandomPeer(false)
134 netAddr, _ := NewNetAddressString(peer.ListenAddr)
135 addrs := []*NetAddress{netAddr}
136 msg := wire.BinaryBytes(struct{ PexMessage }{&pexAddrsMessage{Addrs: addrs}})
137 r.Receive(PexChannel, peer, msg)
138 assert.Equal(size+1, book.Size())
140 msg = wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
141 r.Receive(PexChannel, peer, msg)
144 func TestPEXReactorAbuseFromPeer(t *testing.T) {
145 assert, require := assert.New(t), require.New(t)
147 dir, err := ioutil.TempDir("", "pex_reactor")
149 defer os.RemoveAll(dir)
150 book := NewAddrBook(dir+"addrbook.json", true)
151 book.SetLogger(log.TestingLogger())
153 r := NewPEXReactor(book)
154 r.SetLogger(log.TestingLogger())
155 r.SetMaxMsgCountByPeer(5)
157 peer := createRandomPeer(false)
159 msg := wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
160 for i := 0; i < 10; i++ {
161 r.Receive(PexChannel, peer, msg)
164 assert.True(r.ReachedMaxMsgCountForPeer(peer.ListenAddr))
167 func createRandomPeer(outbound bool) *Peer {
168 addr := cmn.Fmt("%v.%v.%v.%v:46656", rand.Int()%256, rand.Int()%256, rand.Int()%256, rand.Int()%256)
169 netAddr, _ := NewNetAddressString(addr)
171 Key: cmn.RandStr(12),
176 mconn: &MConnection{RemoteAddress: netAddr},
178 p.SetLogger(log.TestingLogger().With("peer", addr))