8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10 log "github.com/sirupsen/logrus"
11 crypto "github.com/tendermint/go-crypto"
13 cfg "github.com/bytom/config"
16 func TestPeerBasic(t *testing.T) {
17 assert, require := assert.New(t), require.New(t)
19 // simulate remote peer
20 rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519(), Config: DefaultPeerConfig(cfg.DefaultP2PConfig())}
24 p, err := createOutboundPeerAndPerformHandshake(rp.Addr(), DefaultPeerConfig(cfg.DefaultP2PConfig()))
30 assert.True(p.IsRunning())
31 assert.True(p.IsOutbound())
32 assert.False(p.IsPersistent())
34 assert.True(p.IsPersistent())
35 assert.Equal(rp.Addr().String(), p.Addr().String())
36 assert.Equal(rp.PubKey(), p.PubKey())
39 func TestPeerWithoutAuthEnc(t *testing.T) {
40 assert, require := assert.New(t), require.New(t)
42 config := DefaultPeerConfig(cfg.DefaultP2PConfig())
43 config.AuthEnc = false
45 // simulate remote peer
46 rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519(), Config: config}
50 p, err := createOutboundPeerAndPerformHandshake(rp.Addr(), config)
56 assert.True(p.IsRunning())
59 func TestPeerSend(t *testing.T) {
60 assert, require := assert.New(t), require.New(t)
62 config := DefaultPeerConfig(cfg.DefaultP2PConfig())
63 config.AuthEnc = false
65 // simulate remote peer
66 rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519(), Config: config}
70 p, err := createOutboundPeerAndPerformHandshake(rp.Addr(), config)
76 assert.True(p.CanSend(0x01))
77 assert.True(p.Send(0x01, "Asylum"))
80 func createOutboundPeerAndPerformHandshake(addr *NetAddress, config *PeerConfig) (*Peer, error) {
81 chDescs := []*ChannelDescriptor{
82 &ChannelDescriptor{ID: 0x01, Priority: 1},
84 reactorsByCh := map[byte]Reactor{0x01: NewTestReactor(chDescs, true)}
85 pk := crypto.GenPrivKeyEd25519()
86 p, err := newOutboundPeerWithConfig(addr, reactorsByCh, chDescs, func(p *Peer, r interface{}) {}, pk, config)
90 err = p.HandshakeTimeout(&NodeInfo{
91 PubKey: pk.PubKey().Unwrap().(crypto.PubKeyEd25519),
94 Version: "123.123.123",
102 type remotePeer struct {
103 PrivKey crypto.PrivKeyEd25519
109 func (p *remotePeer) Addr() *NetAddress {
113 func (p *remotePeer) PubKey() crypto.PubKeyEd25519 {
114 return p.PrivKey.PubKey().Unwrap().(crypto.PubKeyEd25519)
117 func (p *remotePeer) Start() {
118 l, e := net.Listen("tcp", "127.0.0.1:0") // any available address
120 log.Fatalf("net.Listen tcp :0: %+v", e)
122 p.addr = NewNetAddress(l.Addr())
123 p.quit = make(chan struct{})
127 func (p *remotePeer) Stop() {
131 func (p *remotePeer) accept(l net.Listener) {
133 conn, err := l.Accept()
135 log.Fatalf("Failed to accept conn: %+v", err)
137 peer, err := newInboundPeerWithConfig(conn, make(map[byte]Reactor), make([]*ChannelDescriptor, 0), func(p *Peer, r interface{}) {}, p.PrivKey, p.Config)
139 log.Fatalf("Failed to create a peer: %+v", err)
141 err = peer.HandshakeTimeout(&NodeInfo{
142 PubKey: p.PrivKey.PubKey().Unwrap().(crypto.PubKeyEd25519),
143 Moniker: "remote_peer",
145 Version: "123.123.123",
148 log.Fatalf("Failed to perform handshake: %+v", err)