tendermint/p2p/pex/pex_reactor_test.go

371 lines
10 KiB
Go
Raw Normal View History

2018-01-20 18:12:04 -08:00
package pex
2017-01-11 12:17:15 -08:00
import (
"fmt"
2017-01-16 08:31:50 -08:00
"io/ioutil"
"os"
2017-01-11 12:17:15 -08:00
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2018-01-20 18:12:04 -08:00
crypto "github.com/tendermint/go-crypto"
2017-01-12 03:16:51 -08:00
wire "github.com/tendermint/go-wire"
2017-05-01 19:05:26 -07:00
cmn "github.com/tendermint/tmlibs/common"
2017-05-02 00:53:32 -07:00
"github.com/tendermint/tmlibs/log"
2018-01-20 18:12:04 -08:00
cfg "github.com/tendermint/tendermint/config"
"github.com/tendermint/tendermint/p2p"
2018-01-20 21:33:53 -08:00
"github.com/tendermint/tendermint/p2p/conn"
2018-01-20 18:12:04 -08:00
)
var (
config *cfg.P2PConfig
2017-01-11 12:17:15 -08:00
)
2018-01-20 18:12:04 -08:00
func init() {
config = cfg.DefaultP2PConfig()
config.PexReactor = true
}
2017-01-11 12:17:15 -08:00
func TestPEXReactorBasic(t *testing.T) {
2017-04-20 02:04:40 -07:00
assert, require := assert.New(t), require.New(t)
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
2017-04-20 02:04:40 -07:00
require.Nil(err)
2017-10-03 15:49:20 -07:00
defer os.RemoveAll(dir) // nolint: errcheck
2017-01-16 08:31:50 -08:00
book := NewAddrBook(dir+"addrbook.json", true)
2017-05-02 00:53:32 -07:00
book.SetLogger(log.TestingLogger())
2017-01-16 08:31:50 -08:00
r := NewPEXReactor(book, &PEXReactorConfig{})
2017-05-02 00:53:32 -07:00
r.SetLogger(log.TestingLogger())
2017-01-11 12:17:15 -08:00
2017-04-20 02:04:40 -07:00
assert.NotNil(r)
assert.NotEmpty(r.GetChannels())
2017-01-11 12:17:15 -08:00
}
func TestPEXReactorAddRemovePeer(t *testing.T) {
2017-04-20 02:04:40 -07:00
assert, require := assert.New(t), require.New(t)
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
2017-04-20 02:04:40 -07:00
require.Nil(err)
2017-10-03 15:49:20 -07:00
defer os.RemoveAll(dir) // nolint: errcheck
2017-01-16 08:31:50 -08:00
book := NewAddrBook(dir+"addrbook.json", true)
2017-05-02 00:53:32 -07:00
book.SetLogger(log.TestingLogger())
2017-01-16 08:31:50 -08:00
r := NewPEXReactor(book, &PEXReactorConfig{})
2017-05-02 00:53:32 -07:00
r.SetLogger(log.TestingLogger())
2017-01-11 12:17:15 -08:00
size := book.Size()
2018-01-20 18:12:04 -08:00
peer := p2p.CreateRandomPeer(false)
2017-01-11 12:17:15 -08:00
r.AddPeer(peer)
2017-04-20 02:04:40 -07:00
assert.Equal(size+1, book.Size())
2017-01-11 12:17:15 -08:00
r.RemovePeer(peer, "peer not available")
2017-04-20 02:04:40 -07:00
assert.Equal(size+1, book.Size())
2017-01-11 12:17:15 -08:00
2018-01-20 18:12:04 -08:00
outboundPeer := p2p.CreateRandomPeer(true)
2017-01-11 12:17:15 -08:00
r.AddPeer(outboundPeer)
2017-04-20 02:04:40 -07:00
assert.Equal(size+1, book.Size(), "outbound peers should not be added to the address book")
2017-01-11 12:17:15 -08:00
r.RemovePeer(outboundPeer, "peer not available")
2017-04-20 02:04:40 -07:00
assert.Equal(size+1, book.Size())
2017-01-11 12:17:15 -08:00
}
func TestPEXReactorRunning(t *testing.T) {
N := 3
2018-01-20 18:12:04 -08:00
switches := make([]*p2p.Switch, N)
2017-01-11 12:17:15 -08:00
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
require.Nil(t, err)
2017-10-03 15:49:20 -07:00
defer os.RemoveAll(dir) // nolint: errcheck
2017-01-16 08:31:50 -08:00
book := NewAddrBook(dir+"addrbook.json", false)
2017-05-02 00:53:32 -07:00
book.SetLogger(log.TestingLogger())
2017-01-11 12:17:15 -08:00
// create switches
for i := 0; i < N; i++ {
2018-01-20 18:12:04 -08:00
switches[i] = p2p.MakeSwitch(config, i, "127.0.0.1", "123.123.123", func(i int, sw *p2p.Switch) *p2p.Switch {
sw.SetLogger(log.TestingLogger().With("switch", i))
r := NewPEXReactor(book, &PEXReactorConfig{})
2017-05-02 00:53:32 -07:00
r.SetLogger(log.TestingLogger())
2017-01-11 12:17:15 -08:00
r.SetEnsurePeersPeriod(250 * time.Millisecond)
sw.AddReactor("pex", r)
return sw
})
}
// fill the address book and add listeners
for _, s := range switches {
p2p: introduce peerConn to simplify peer creation (#1226) * expose AuthEnc in the P2P config if AuthEnc is true, dialed peers must have a node ID in the address and it must match the persistent pubkey from the secret handshake. Refs #1157 * fixes after my own review * fix docs * fix build failure ``` p2p/pex/pex_reactor_test.go:288:88: cannot use seed.NodeInfo().NetAddress() (type *p2p.NetAddress) as type string in array or slice literal ``` * p2p: introduce peerConn to simplify peer creation * Introduce `peerConn` containing the known fields of `peer` * `peer` only created in `sw.addPeer` once handshake is complete and NodeInfo is checked * Eliminates some mutable variables and makes the code flow better * Simplifies the `newXxxPeer` funcs * Use ID instead of PubKey where possible. * SetPubKeyFilter -> SetIDFilter * nodeInfo.Validate takes ID * remove peer.PubKey() * persistent node ids * fixes from review * test: use ip_plus_id.sh more * fix invalid memory panic during fast_sync test ``` 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: panic: runtime error: invalid memory address or nil pointer dereference 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: [signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x98dd3e] 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: goroutine 3432 [running]: 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.newOutboundPeerConn(0xc423fd1380, 0xc420933e00, 0x1, 0x1239a60, 0 xc420128c40, 0x2, 0x42caf6, 0xc42001f300, 0xc422831d98, 0xc4227951c0, ...) 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/peer.go:123 +0x31e 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.(*Switch).addOutboundPeerWithConfig(0xc4200ad040, 0xc423fd1380, 0 xc420933e00, 0xc423f48801, 0x28, 0x2) 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:455 +0x12b 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.(*Switch).DialPeerWithAddress(0xc4200ad040, 0xc423fd1380, 0x1, 0x 0, 0x0) 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:371 +0xdc 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.(*Switch).reconnectToPeer(0xc4200ad040, 0x123e000, 0xc42007bb00) 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:290 +0x25f 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: created by github.com/tendermint/tendermint/p2p.(*Switch).StopPeerForError 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:256 +0x1b7 ```
2018-02-27 03:54:40 -08:00
addr := s.NodeInfo().NetAddress()
2017-01-11 12:17:15 -08:00
book.AddAddress(addr, addr)
2018-01-20 18:12:04 -08:00
s.AddListener(p2p.NewDefaultListener("tcp", s.NodeInfo().ListenAddr, true, log.TestingLogger()))
2017-01-11 12:17:15 -08:00
}
// start switches
for _, s := range switches {
err := s.Start() // start switch and reactors
require.Nil(t, err)
2017-01-11 12:17:15 -08:00
}
assertPeersWithTimeout(t, switches, 10*time.Millisecond, 10*time.Second, N-1)
2017-01-11 12:17:15 -08:00
// stop them
for _, s := range switches {
s.Stop()
}
}
func assertPeersWithTimeout(t *testing.T, switches []*p2p.Switch, checkPeriod, timeout time.Duration, nPeers int) {
ticker := time.NewTicker(checkPeriod)
remaining := timeout
2017-11-07 15:08:45 -08:00
for {
select {
case <-ticker.C:
// check peers are connected
allGood := true
for _, s := range switches {
outbound, inbound, _ := s.NumPeers()
if outbound+inbound < nPeers {
2017-11-07 15:08:45 -08:00
allGood = false
}
}
remaining -= checkPeriod
if remaining < 0 {
remaining = 0
}
2017-11-07 15:08:45 -08:00
if allGood {
return
}
case <-time.After(remaining):
2017-11-07 15:08:45 -08:00
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)
return
}
}
}
2017-01-12 03:16:51 -08:00
func TestPEXReactorReceive(t *testing.T) {
2017-04-20 02:04:40 -07:00
assert, require := assert.New(t), require.New(t)
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
2017-04-20 02:04:40 -07:00
require.Nil(err)
2017-10-03 15:49:20 -07:00
defer os.RemoveAll(dir) // nolint: errcheck
2017-09-05 14:10:11 -07:00
book := NewAddrBook(dir+"addrbook.json", false)
2017-05-02 00:53:32 -07:00
book.SetLogger(log.TestingLogger())
2017-01-16 08:31:50 -08:00
r := NewPEXReactor(book, &PEXReactorConfig{})
2017-05-02 00:53:32 -07:00
r.SetLogger(log.TestingLogger())
2017-01-12 03:16:51 -08:00
2018-01-20 18:12:04 -08:00
peer := p2p.CreateRandomPeer(false)
2017-01-12 03:16:51 -08:00
2018-01-14 00:22:01 -08:00
// we have to send a request to receive responses
r.RequestAddrs(peer)
2018-01-14 00:22:01 -08:00
2017-01-12 03:16:51 -08:00
size := book.Size()
2018-01-20 21:33:53 -08:00
addrs := []*p2p.NetAddress{peer.NodeInfo().NetAddress()}
2017-01-12 03:16:51 -08:00
msg := wire.BinaryBytes(struct{ PexMessage }{&pexAddrsMessage{Addrs: addrs}})
r.Receive(PexChannel, peer, msg)
2017-04-20 02:04:40 -07:00
assert.Equal(size+1, book.Size())
2017-01-12 03:16:51 -08:00
msg = wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
r.Receive(PexChannel, peer, msg)
}
2018-01-14 00:22:01 -08:00
func TestPEXReactorRequestMessageAbuse(t *testing.T) {
2017-04-20 02:04:40 -07:00
assert, require := assert.New(t), require.New(t)
2017-01-16 08:31:50 -08:00
dir, err := ioutil.TempDir("", "pex_reactor")
2017-04-20 02:04:40 -07:00
require.Nil(err)
2017-10-03 15:49:20 -07:00
defer os.RemoveAll(dir) // nolint: errcheck
2017-01-16 08:31:50 -08:00
book := NewAddrBook(dir+"addrbook.json", true)
2017-05-02 00:53:32 -07:00
book.SetLogger(log.TestingLogger())
2017-01-16 08:31:50 -08:00
r := NewPEXReactor(book, &PEXReactorConfig{})
2018-01-20 18:12:04 -08:00
sw := p2p.MakeSwitch(config, 0, "127.0.0.1", "123.123.123", func(i int, sw *p2p.Switch) *p2p.Switch { return sw })
2018-01-14 00:22:01 -08:00
sw.SetLogger(log.TestingLogger())
sw.AddReactor("PEX", r)
r.SetSwitch(sw)
2017-05-02 00:53:32 -07:00
r.SetLogger(log.TestingLogger())
2017-01-12 05:56:40 -08:00
2018-01-14 00:22:01 -08:00
peer := newMockPeer()
2018-01-20 18:12:04 -08:00
p2p.AddPeerToSwitch(sw, peer)
2018-01-14 10:03:57 -08:00
assert.True(sw.Peers().Has(peer.ID()))
2017-01-12 05:56:40 -08:00
2018-01-14 00:22:01 -08:00
id := string(peer.ID())
2017-01-12 05:56:40 -08:00
msg := wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
2018-01-14 00:22:01 -08:00
// first time creates the entry
r.Receive(PexChannel, peer, msg)
assert.True(r.lastReceivedRequests.Has(id))
2018-01-14 10:03:57 -08:00
assert.True(sw.Peers().Has(peer.ID()))
2018-01-14 00:22:01 -08:00
// next time sets the last time value
r.Receive(PexChannel, peer, msg)
assert.True(r.lastReceivedRequests.Has(id))
2018-01-14 10:03:57 -08:00
assert.True(sw.Peers().Has(peer.ID()))
2018-01-14 00:22:01 -08:00
// third time is too many too soon - peer is removed
r.Receive(PexChannel, peer, msg)
assert.False(r.lastReceivedRequests.Has(id))
assert.False(sw.Peers().Has(peer.ID()))
}
func TestPEXReactorAddrsMessageAbuse(t *testing.T) {
assert, require := assert.New(t), require.New(t)
dir, err := ioutil.TempDir("", "pex_reactor")
require.Nil(err)
defer os.RemoveAll(dir) // nolint: errcheck
book := NewAddrBook(dir+"addrbook.json", true)
book.SetLogger(log.TestingLogger())
r := NewPEXReactor(book, &PEXReactorConfig{})
2018-01-20 18:12:04 -08:00
sw := p2p.MakeSwitch(config, 0, "127.0.0.1", "123.123.123", func(i int, sw *p2p.Switch) *p2p.Switch { return sw })
2018-01-14 00:22:01 -08:00
sw.SetLogger(log.TestingLogger())
sw.AddReactor("PEX", r)
r.SetSwitch(sw)
r.SetLogger(log.TestingLogger())
peer := newMockPeer()
2018-01-20 18:12:04 -08:00
p2p.AddPeerToSwitch(sw, peer)
2018-01-14 10:03:57 -08:00
assert.True(sw.Peers().Has(peer.ID()))
2018-01-14 00:22:01 -08:00
id := string(peer.ID())
// request addrs from the peer
r.RequestAddrs(peer)
2018-01-14 00:22:01 -08:00
assert.True(r.requestsSent.Has(id))
2018-01-14 10:03:57 -08:00
assert.True(sw.Peers().Has(peer.ID()))
2018-01-14 00:22:01 -08:00
2018-01-20 21:33:53 -08:00
addrs := []*p2p.NetAddress{peer.NodeInfo().NetAddress()}
2018-01-14 00:22:01 -08:00
msg := wire.BinaryBytes(struct{ PexMessage }{&pexAddrsMessage{Addrs: addrs}})
// receive some addrs. should clear the request
r.Receive(PexChannel, peer, msg)
assert.False(r.requestsSent.Has(id))
2018-01-14 10:03:57 -08:00
assert.True(sw.Peers().Has(peer.ID()))
2018-01-14 00:22:01 -08:00
// receiving more addrs causes a disconnect
r.Receive(PexChannel, peer, msg)
assert.False(sw.Peers().Has(peer.ID()))
2017-01-12 05:56:40 -08:00
}
func TestPEXReactorUsesSeedsIfNeeded(t *testing.T) {
dir, err := ioutil.TempDir("", "pex_reactor")
require.Nil(t, err)
defer os.RemoveAll(dir) // nolint: errcheck
book := NewAddrBook(dir+"addrbook.json", false)
book.SetLogger(log.TestingLogger())
// 1. create seed
2018-01-20 18:12:04 -08:00
seed := p2p.MakeSwitch(config, 0, "127.0.0.1", "123.123.123", func(i int, sw *p2p.Switch) *p2p.Switch {
sw.SetLogger(log.TestingLogger())
r := NewPEXReactor(book, &PEXReactorConfig{})
r.SetLogger(log.TestingLogger())
r.SetEnsurePeersPeriod(250 * time.Millisecond)
sw.AddReactor("pex", r)
return sw
})
2018-01-20 18:12:04 -08:00
seed.AddListener(p2p.NewDefaultListener("tcp", seed.NodeInfo().ListenAddr, true, log.TestingLogger()))
err = seed.Start()
require.Nil(t, err)
defer seed.Stop()
// 2. create usual peer
2018-01-20 18:12:04 -08:00
sw := p2p.MakeSwitch(config, 1, "127.0.0.1", "123.123.123", func(i int, sw *p2p.Switch) *p2p.Switch {
sw.SetLogger(log.TestingLogger())
p2p: introduce peerConn to simplify peer creation (#1226) * expose AuthEnc in the P2P config if AuthEnc is true, dialed peers must have a node ID in the address and it must match the persistent pubkey from the secret handshake. Refs #1157 * fixes after my own review * fix docs * fix build failure ``` p2p/pex/pex_reactor_test.go:288:88: cannot use seed.NodeInfo().NetAddress() (type *p2p.NetAddress) as type string in array or slice literal ``` * p2p: introduce peerConn to simplify peer creation * Introduce `peerConn` containing the known fields of `peer` * `peer` only created in `sw.addPeer` once handshake is complete and NodeInfo is checked * Eliminates some mutable variables and makes the code flow better * Simplifies the `newXxxPeer` funcs * Use ID instead of PubKey where possible. * SetPubKeyFilter -> SetIDFilter * nodeInfo.Validate takes ID * remove peer.PubKey() * persistent node ids * fixes from review * test: use ip_plus_id.sh more * fix invalid memory panic during fast_sync test ``` 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: panic: runtime error: invalid memory address or nil pointer dereference 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: [signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x98dd3e] 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: goroutine 3432 [running]: 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.newOutboundPeerConn(0xc423fd1380, 0xc420933e00, 0x1, 0x1239a60, 0 xc420128c40, 0x2, 0x42caf6, 0xc42001f300, 0xc422831d98, 0xc4227951c0, ...) 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/peer.go:123 +0x31e 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.(*Switch).addOutboundPeerWithConfig(0xc4200ad040, 0xc423fd1380, 0 xc420933e00, 0xc423f48801, 0x28, 0x2) 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:455 +0x12b 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.(*Switch).DialPeerWithAddress(0xc4200ad040, 0xc423fd1380, 0x1, 0x 0, 0x0) 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:371 +0xdc 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.(*Switch).reconnectToPeer(0xc4200ad040, 0x123e000, 0xc42007bb00) 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:290 +0x25f 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: created by github.com/tendermint/tendermint/p2p.(*Switch).StopPeerForError 2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:256 +0x1b7 ```
2018-02-27 03:54:40 -08:00
r := NewPEXReactor(book, &PEXReactorConfig{Seeds: []string{seed.NodeInfo().NetAddress().String()}})
r.SetLogger(log.TestingLogger())
r.SetEnsurePeersPeriod(250 * time.Millisecond)
sw.AddReactor("pex", r)
return sw
})
err = sw.Start()
require.Nil(t, err)
defer sw.Stop()
// 3. check that peer at least connects to seed
assertPeersWithTimeout(t, []*p2p.Switch{sw}, 10*time.Millisecond, 10*time.Second, 1)
}
2018-01-09 17:12:41 -08:00
func TestPEXReactorCrawlStatus(t *testing.T) {
assert, require := assert.New(t), require.New(t)
dir, err := ioutil.TempDir("", "pex_reactor")
require.Nil(err)
defer os.RemoveAll(dir) // nolint: errcheck
book := NewAddrBook(dir+"addrbook.json", false)
book.SetLogger(log.TestingLogger())
pexR := NewPEXReactor(book, &PEXReactorConfig{SeedMode: true})
2018-01-09 17:12:41 -08:00
// Seed/Crawler mode uses data from the Switch
2018-01-20 18:12:04 -08:00
p2p.MakeSwitch(config, 0, "127.0.0.1", "123.123.123", func(i int, sw *p2p.Switch) *p2p.Switch {
pexR.SetLogger(log.TestingLogger())
2018-01-09 17:12:41 -08:00
sw.SetLogger(log.TestingLogger().With("switch", i))
sw.AddReactor("pex", pexR)
2018-01-09 17:12:41 -08:00
return sw
})
// Create a peer, add it to the peer set and the addrbook.
2018-01-20 18:12:04 -08:00
peer := p2p.CreateRandomPeer(false)
p2p.AddPeerToSwitch(pexR.Switch, peer)
addr1 := peer.NodeInfo().NetAddress()
pexR.book.AddAddress(addr1, addr1)
// Add a non-connected address to the book.
2018-01-20 18:12:04 -08:00
_, addr2 := p2p.CreateRoutableAddr()
pexR.book.AddAddress(addr2, addr1)
2018-01-09 17:12:41 -08:00
// Get some peerInfos to crawl
peerInfos := pexR.getPeersToCrawl()
2018-01-09 17:12:41 -08:00
// Make sure it has the proper number of elements
assert.Equal(2, len(peerInfos))
2018-01-09 17:12:41 -08:00
// TODO: test
2018-01-09 17:12:41 -08:00
}
2018-01-14 00:22:01 -08:00
type mockPeer struct {
*cmn.BaseService
pubKey crypto.PubKey
2018-01-20 21:33:53 -08:00
addr *p2p.NetAddress
2018-01-14 00:22:01 -08:00
outbound, persistent bool
}
func newMockPeer() mockPeer {
2018-01-20 18:12:04 -08:00
_, netAddr := p2p.CreateRoutableAddr()
2018-01-14 00:22:01 -08:00
mp := mockPeer{
addr: netAddr,
pubKey: crypto.GenPrivKeyEd25519().Wrap().PubKey(),
}
mp.BaseService = cmn.NewBaseService(nil, "MockPeer", mp)
mp.Start()
return mp
}
2018-01-20 21:33:53 -08:00
func (mp mockPeer) ID() p2p.ID { return p2p.PubKeyToID(mp.pubKey) }
2018-01-14 00:22:01 -08:00
func (mp mockPeer) IsOutbound() bool { return mp.outbound }
func (mp mockPeer) IsPersistent() bool { return mp.persistent }
2018-01-20 21:33:53 -08:00
func (mp mockPeer) NodeInfo() p2p.NodeInfo {
return p2p.NodeInfo{
2018-01-14 00:22:01 -08:00
PubKey: mp.pubKey,
ListenAddr: mp.addr.DialString(),
}
}
2018-01-20 21:33:53 -08:00
func (mp mockPeer) Status() conn.ConnectionStatus { return conn.ConnectionStatus{} }
func (mp mockPeer) Send(byte, interface{}) bool { return false }
func (mp mockPeer) TrySend(byte, interface{}) bool { return false }
func (mp mockPeer) Set(string, interface{}) {}
func (mp mockPeer) Get(string) interface{} { return nil }