You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.3 KiB

8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
  1. package p2p
  2. import (
  3. golog "log"
  4. "net"
  5. "testing"
  6. "time"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. crypto "github.com/tendermint/go-crypto"
  10. )
  11. func TestPeerStartStop(t *testing.T) {
  12. assert, require := assert.New(t), require.New(t)
  13. // simulate remote peer
  14. rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519()}
  15. rp.Start()
  16. defer rp.Stop()
  17. p, err := createPeerAndPerformHandshake(rp.RemoteAddr())
  18. require.Nil(err)
  19. p.Start()
  20. defer p.Stop()
  21. assert.True(p.IsRunning())
  22. }
  23. func createPeerAndPerformHandshake(addr *NetAddress) (*Peer, error) {
  24. chDescs := []*ChannelDescriptor{
  25. &ChannelDescriptor{ID: 0x01, Priority: 1},
  26. }
  27. reactorsByCh := map[byte]Reactor{0x01: NewTestReactor(chDescs, true)}
  28. pk := crypto.GenPrivKeyEd25519()
  29. p, err := newOutboundPeer(addr, reactorsByCh, chDescs, func(p *Peer, r interface{}) {}, pk)
  30. if err != nil {
  31. return nil, err
  32. }
  33. err = p.HandshakeTimeout(&NodeInfo{
  34. PubKey: pk.PubKey().(crypto.PubKeyEd25519),
  35. Moniker: "host_peer",
  36. Network: "testing",
  37. Version: "123.123.123",
  38. }, 1*time.Second)
  39. if err != nil {
  40. return nil, err
  41. }
  42. return p, nil
  43. }
  44. type remotePeer struct {
  45. PrivKey crypto.PrivKeyEd25519
  46. addr *NetAddress
  47. quit chan struct{}
  48. }
  49. func (p *remotePeer) RemoteAddr() *NetAddress {
  50. return p.addr
  51. }
  52. func (p *remotePeer) Start() {
  53. l, e := net.Listen("tcp", "127.0.0.1:0") // any available address
  54. if e != nil {
  55. golog.Fatalf("net.Listen tcp :0: %+v", e)
  56. }
  57. p.addr = NewNetAddress(l.Addr())
  58. p.quit = make(chan struct{})
  59. go p.accept(l)
  60. }
  61. func (p *remotePeer) Stop() {
  62. close(p.quit)
  63. }
  64. func (p *remotePeer) accept(l net.Listener) {
  65. for {
  66. conn, err := l.Accept()
  67. if err != nil {
  68. golog.Fatalf("Failed to accept conn: %+v", err)
  69. }
  70. peer, err := newInboundPeer(conn, make(map[byte]Reactor), make([]*ChannelDescriptor, 0), func(p *Peer, r interface{}) {}, p.PrivKey)
  71. if err != nil {
  72. golog.Fatalf("Failed to create a peer: %+v", err)
  73. }
  74. err = peer.HandshakeTimeout(&NodeInfo{
  75. PubKey: p.PrivKey.PubKey().(crypto.PubKeyEd25519),
  76. Moniker: "remote_peer",
  77. Network: "testing",
  78. Version: "123.123.123",
  79. }, 1*time.Second)
  80. if err != nil {
  81. golog.Fatalf("Failed to perform handshake: %+v", err)
  82. }
  83. select {
  84. case <-p.quit:
  85. conn.Close()
  86. return
  87. default:
  88. }
  89. }
  90. }