2017-01-12 00:17:15 +04:00
|
|
|
package p2p
|
|
|
|
|
|
|
|
import (
|
2017-11-07 15:02:42 -05:00
|
|
|
"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"
|
2018-01-01 22:34:49 -05:00
|
|
|
crypto "github.com/tendermint/go-crypto"
|
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-10-03 18:49:20 -04:00
|
|
|
defer os.RemoveAll(dir) // nolint: errcheck
|
2017-01-16 20:31:50 +04:00
|
|
|
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
|
|
|
|
2018-01-09 17:09:09 -06:00
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{})
|
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-10-03 18:49:20 -04:00
|
|
|
defer os.RemoveAll(dir) // nolint: errcheck
|
2017-01-16 20:31:50 +04:00
|
|
|
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
|
|
|
|
2018-01-09 17:09:09 -06:00
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{})
|
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) {
|
|
|
|
N := 3
|
|
|
|
switches := make([]*Switch, N)
|
|
|
|
|
2017-01-16 20:31:50 +04:00
|
|
|
dir, err := ioutil.TempDir("", "pex_reactor")
|
2017-11-29 10:53:30 -06:00
|
|
|
require.Nil(t, err)
|
2017-10-03 18:49:20 -04:00
|
|
|
defer os.RemoveAll(dir) // nolint: errcheck
|
2017-01-16 20:31:50 +04:00
|
|
|
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 {
|
2017-05-13 17:05:44 +02:00
|
|
|
sw.SetLogger(log.TestingLogger().With("switch", i))
|
|
|
|
|
2018-01-09 17:09:09 -06:00
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{})
|
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 {
|
2017-11-06 13:20:39 -05:00
|
|
|
err := s.Start() // start switch and reactors
|
2017-11-29 10:53:30 -06:00
|
|
|
require.Nil(t, err)
|
2017-01-12 00:17:15 +04:00
|
|
|
}
|
|
|
|
|
2017-11-07 15:02:42 -05: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()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-07 15:02:42 -05:00
|
|
|
func assertSomePeersWithTimeout(t *testing.T, switches []*Switch, checkPeriod, timeout time.Duration) {
|
|
|
|
ticker := time.NewTicker(checkPeriod)
|
2018-01-09 18:29:29 -06:00
|
|
|
remaining := timeout
|
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 15:02:42 -05:00
|
|
|
}
|
2018-01-09 18:29:29 -06:00
|
|
|
remaining -= checkPeriod
|
|
|
|
if remaining < 0 {
|
|
|
|
remaining = 0
|
|
|
|
}
|
2017-11-07 18:08:45 -05:00
|
|
|
if allGood {
|
|
|
|
return
|
|
|
|
}
|
2018-01-09 18:29:29 -06:00
|
|
|
case <-time.After(remaining):
|
2017-11-07 18:08:45 -05: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)
|
2018-01-09 18:29:29 -06:00
|
|
|
return
|
2017-11-07 15:02:42 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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-10-03 18:49:20 -04:00
|
|
|
defer os.RemoveAll(dir) // nolint: errcheck
|
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
|
|
|
|
2018-01-09 17:09:09 -06:00
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{})
|
2017-05-02 11:53:32 +04:00
|
|
|
r.SetLogger(log.TestingLogger())
|
2017-01-12 15:16:51 +04:00
|
|
|
|
|
|
|
peer := createRandomPeer(false)
|
|
|
|
|
2018-01-14 03:22:01 -05:00
|
|
|
// we have to send a request to receive responses
|
|
|
|
r.RequestPEX(peer)
|
|
|
|
|
2017-01-12 15:16:51 +04:00
|
|
|
size := book.Size()
|
2018-01-14 03:22:01 -05:00
|
|
|
addrs := []*NetAddress{peer.NodeInfo().NetAddress()}
|
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)
|
|
|
|
}
|
|
|
|
|
2018-01-14 03:22:01 -05:00
|
|
|
func TestPEXReactorRequestMessageAbuse(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-10-03 18:49:20 -04:00
|
|
|
defer os.RemoveAll(dir) // nolint: errcheck
|
2017-01-16 20:31:50 +04:00
|
|
|
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
|
|
|
|
2018-01-09 17:09:09 -06:00
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{})
|
2018-01-14 03:22:01 -05:00
|
|
|
sw := makeSwitch(config, 0, "127.0.0.1", "123.123.123", func(i int, sw *Switch) *Switch { return sw })
|
|
|
|
sw.SetLogger(log.TestingLogger())
|
|
|
|
sw.AddReactor("PEX", r)
|
|
|
|
r.SetSwitch(sw)
|
2017-05-02 11:53:32 +04:00
|
|
|
r.SetLogger(log.TestingLogger())
|
2017-01-12 17:56:40 +04:00
|
|
|
|
2018-01-14 03:22:01 -05:00
|
|
|
peer := newMockPeer()
|
2018-01-14 13:03:57 -05:00
|
|
|
sw.peers.Add(peer)
|
|
|
|
assert.True(sw.Peers().Has(peer.ID()))
|
2017-01-12 17:56:40 +04:00
|
|
|
|
2018-01-14 03:22:01 -05:00
|
|
|
id := string(peer.ID())
|
2017-01-12 17:56:40 +04:00
|
|
|
msg := wire.BinaryBytes(struct{ PexMessage }{&pexRequestMessage{}})
|
|
|
|
|
2018-01-14 03:22:01 -05:00
|
|
|
// first time creates the entry
|
|
|
|
r.Receive(PexChannel, peer, msg)
|
|
|
|
assert.True(r.lastReceivedRequests.Has(id))
|
2018-01-14 13:03:57 -05:00
|
|
|
assert.True(sw.Peers().Has(peer.ID()))
|
2018-01-14 03:22:01 -05:00
|
|
|
|
|
|
|
// next time sets the last time value
|
|
|
|
r.Receive(PexChannel, peer, msg)
|
|
|
|
assert.True(r.lastReceivedRequests.Has(id))
|
2018-01-14 13:03:57 -05:00
|
|
|
assert.True(sw.Peers().Has(peer.ID()))
|
2018-01-14 03:22:01 -05: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{})
|
|
|
|
sw := makeSwitch(config, 0, "127.0.0.1", "123.123.123", func(i int, sw *Switch) *Switch { return sw })
|
|
|
|
sw.SetLogger(log.TestingLogger())
|
|
|
|
sw.AddReactor("PEX", r)
|
|
|
|
r.SetSwitch(sw)
|
|
|
|
r.SetLogger(log.TestingLogger())
|
|
|
|
|
|
|
|
peer := newMockPeer()
|
2018-01-14 13:03:57 -05:00
|
|
|
sw.peers.Add(peer)
|
|
|
|
assert.True(sw.Peers().Has(peer.ID()))
|
2018-01-14 03:22:01 -05:00
|
|
|
|
|
|
|
id := string(peer.ID())
|
|
|
|
|
|
|
|
// request addrs from the peer
|
|
|
|
r.RequestPEX(peer)
|
|
|
|
assert.True(r.requestsSent.Has(id))
|
2018-01-14 13:03:57 -05:00
|
|
|
assert.True(sw.Peers().Has(peer.ID()))
|
2018-01-14 03:22:01 -05:00
|
|
|
|
|
|
|
addrs := []*NetAddress{peer.NodeInfo().NetAddress()}
|
|
|
|
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 13:03:57 -05:00
|
|
|
assert.True(sw.Peers().Has(peer.ID()))
|
2018-01-14 03:22:01 -05:00
|
|
|
|
|
|
|
// receiving more addrs causes a disconnect
|
|
|
|
r.Receive(PexChannel, peer, msg)
|
|
|
|
assert.False(sw.Peers().Has(peer.ID()))
|
2017-01-12 17:56:40 +04:00
|
|
|
}
|
|
|
|
|
2018-01-09 18:29:29 -06: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
|
|
|
|
seed := makeSwitch(config, 0, "127.0.0.1", "123.123.123", func(i int, sw *Switch) *Switch {
|
|
|
|
sw.SetLogger(log.TestingLogger())
|
|
|
|
|
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{})
|
|
|
|
r.SetLogger(log.TestingLogger())
|
|
|
|
r.SetEnsurePeersPeriod(250 * time.Millisecond)
|
|
|
|
sw.AddReactor("pex", r)
|
|
|
|
return sw
|
|
|
|
})
|
|
|
|
seed.AddListener(NewDefaultListener("tcp", seed.NodeInfo().ListenAddr, true, log.TestingLogger()))
|
|
|
|
err = seed.Start()
|
|
|
|
require.Nil(t, err)
|
|
|
|
defer seed.Stop()
|
|
|
|
|
|
|
|
// 2. create usual peer
|
|
|
|
sw := makeSwitch(config, 1, "127.0.0.1", "123.123.123", func(i int, sw *Switch) *Switch {
|
|
|
|
sw.SetLogger(log.TestingLogger())
|
|
|
|
|
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{Seeds: []string{seed.NodeInfo().ListenAddr}})
|
|
|
|
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
|
|
|
|
assertSomePeersWithTimeout(t, []*Switch{sw}, 10*time.Millisecond, 10*time.Second)
|
|
|
|
}
|
|
|
|
|
2018-01-09 20:12:41 -05: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())
|
|
|
|
|
|
|
|
var r *PEXReactor
|
|
|
|
// Seed/Crawler mode uses data from the Switch
|
|
|
|
makeSwitch(config, 0, "127.0.0.1", "123.123.123", func(i int, sw *Switch) *Switch {
|
|
|
|
r = NewPEXReactor(book, true)
|
|
|
|
r.SetLogger(log.TestingLogger())
|
|
|
|
sw.SetLogger(log.TestingLogger().With("switch", i))
|
|
|
|
sw.AddReactor("pex", r)
|
|
|
|
return sw
|
|
|
|
})
|
|
|
|
|
|
|
|
// Create a peer, and add it to the peer set
|
|
|
|
peer := createRandomPeer(false)
|
|
|
|
r.Switch.peers.Add(peer)
|
|
|
|
// Add the peer address to the address book
|
|
|
|
addr1, _ := NewNetAddressString(peer.NodeInfo().ListenAddr)
|
|
|
|
r.book.AddAddress(addr1, addr1)
|
|
|
|
// Add an address to the book that does not have a peer
|
|
|
|
_, addr2 := createRoutableAddr()
|
|
|
|
r.book.AddAddress(addr2, addr1)
|
|
|
|
|
|
|
|
// Get the crawl status data
|
|
|
|
status := r.getCrawlStatus()
|
|
|
|
|
|
|
|
// Make sure it has the proper number of elements
|
|
|
|
assert.Equal(2, len(status))
|
|
|
|
|
|
|
|
var num int
|
|
|
|
for _, cs := range status {
|
|
|
|
if cs.PeerID != "" {
|
|
|
|
num++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Check that only one has been identified as a connected peer
|
|
|
|
assert.Equal(1, num)
|
|
|
|
}
|
|
|
|
|
2017-11-20 19:56:44 +00:00
|
|
|
func createRoutableAddr() (addr string, netAddr *NetAddress) {
|
|
|
|
for {
|
|
|
|
addr = cmn.Fmt("%v.%v.%v.%v:46656", rand.Int()%256, rand.Int()%256, rand.Int()%256, rand.Int()%256)
|
|
|
|
netAddr, _ = NewNetAddressString(addr)
|
|
|
|
if netAddr.Routable() {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-09-12 20:49:22 -04:00
|
|
|
func createRandomPeer(outbound bool) *peer {
|
2017-11-20 19:56:44 +00:00
|
|
|
addr, netAddr := createRoutableAddr()
|
2017-09-12 20:49:22 -04:00
|
|
|
p := &peer{
|
2018-01-14 00:10:29 -05:00
|
|
|
nodeInfo: NodeInfo{
|
2018-01-13 16:50:03 -05:00
|
|
|
ListenAddr: netAddr.String(),
|
2018-01-01 22:34:49 -05:00
|
|
|
PubKey: crypto.GenPrivKeyEd25519().Wrap().PubKey(),
|
2017-01-12 00:17:15 +04:00
|
|
|
},
|
|
|
|
outbound: outbound,
|
2018-01-01 23:08:20 -05:00
|
|
|
mconn: &MConnection{},
|
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
|
|
|
}
|
2018-01-14 03:22:01 -05:00
|
|
|
|
|
|
|
type mockPeer struct {
|
|
|
|
*cmn.BaseService
|
|
|
|
pubKey crypto.PubKey
|
|
|
|
addr *NetAddress
|
|
|
|
outbound, persistent bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func newMockPeer() mockPeer {
|
|
|
|
_, netAddr := createRoutableAddr()
|
|
|
|
mp := mockPeer{
|
|
|
|
addr: netAddr,
|
|
|
|
pubKey: crypto.GenPrivKeyEd25519().Wrap().PubKey(),
|
|
|
|
}
|
|
|
|
mp.BaseService = cmn.NewBaseService(nil, "MockPeer", mp)
|
|
|
|
mp.Start()
|
|
|
|
return mp
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mp mockPeer) ID() ID { return PubKeyToID(mp.pubKey) }
|
|
|
|
func (mp mockPeer) IsOutbound() bool { return mp.outbound }
|
|
|
|
func (mp mockPeer) IsPersistent() bool { return mp.persistent }
|
|
|
|
func (mp mockPeer) NodeInfo() NodeInfo {
|
|
|
|
return NodeInfo{
|
|
|
|
PubKey: mp.pubKey,
|
|
|
|
ListenAddr: mp.addr.DialString(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func (mp mockPeer) Status() ConnectionStatus { return 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 }
|