peer_test.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package p2p
  2. import (
  3. "bufio"
  4. "net"
  5. "reflect"
  6. "testing"
  7. "time"
  8. )
  9. var discard = Protocol{
  10. Name: "discard",
  11. Length: 1,
  12. Run: func(p *Peer, rw MsgReadWriter) error {
  13. for {
  14. msg, err := rw.ReadMsg()
  15. if err != nil {
  16. return err
  17. }
  18. if err = msg.Discard(); err != nil {
  19. return err
  20. }
  21. }
  22. },
  23. }
  24. func testPeer(protos []Protocol) (net.Conn, *Peer, <-chan error) {
  25. conn1, conn2 := net.Pipe()
  26. id := NewSimpleClientIdentity("test", "0", "0", "public key")
  27. peer := newPeer(conn1, protos, nil)
  28. peer.ourID = id
  29. peer.pubkeyHook = func(*peerAddr) error { return nil }
  30. errc := make(chan error, 1)
  31. go func() {
  32. _, err := peer.loop()
  33. errc <- err
  34. }()
  35. return conn2, peer, errc
  36. }
  37. func TestPeerProtoReadMsg(t *testing.T) {
  38. defer testlog(t).detach()
  39. done := make(chan struct{})
  40. proto := Protocol{
  41. Name: "a",
  42. Length: 5,
  43. Run: func(peer *Peer, rw MsgReadWriter) error {
  44. msg, err := rw.ReadMsg()
  45. if err != nil {
  46. t.Errorf("read error: %v", err)
  47. }
  48. if msg.Code != 2 {
  49. t.Errorf("incorrect msg code %d relayed to protocol", msg.Code)
  50. }
  51. data, err := msg.Data()
  52. if err != nil {
  53. t.Errorf("data decoding error: %v", err)
  54. }
  55. expdata := []interface{}{1, []byte{0x30, 0x30, 0x30}}
  56. if !reflect.DeepEqual(data.Slice(), expdata) {
  57. t.Errorf("incorrect msg data %#v", data.Slice())
  58. }
  59. close(done)
  60. return nil
  61. },
  62. }
  63. net, peer, errc := testPeer([]Protocol{proto})
  64. defer net.Close()
  65. peer.startSubprotocols([]Cap{proto.cap()})
  66. writeMsg(net, NewMsg(18, 1, "000"))
  67. select {
  68. case <-done:
  69. case err := <-errc:
  70. t.Errorf("peer returned: %v", err)
  71. case <-time.After(2 * time.Second):
  72. t.Errorf("receive timeout")
  73. }
  74. }
  75. func TestPeerProtoReadLargeMsg(t *testing.T) {
  76. defer testlog(t).detach()
  77. msgsize := uint32(10 * 1024 * 1024)
  78. done := make(chan struct{})
  79. proto := Protocol{
  80. Name: "a",
  81. Length: 5,
  82. Run: func(peer *Peer, rw MsgReadWriter) error {
  83. msg, err := rw.ReadMsg()
  84. if err != nil {
  85. t.Errorf("read error: %v", err)
  86. }
  87. if msg.Size != msgsize+4 {
  88. t.Errorf("incorrect msg.Size, got %d, expected %d", msg.Size, msgsize)
  89. }
  90. msg.Discard()
  91. close(done)
  92. return nil
  93. },
  94. }
  95. net, peer, errc := testPeer([]Protocol{proto})
  96. defer net.Close()
  97. peer.startSubprotocols([]Cap{proto.cap()})
  98. writeMsg(net, NewMsg(18, make([]byte, msgsize)))
  99. select {
  100. case <-done:
  101. case err := <-errc:
  102. t.Errorf("peer returned: %v", err)
  103. case <-time.After(2 * time.Second):
  104. t.Errorf("receive timeout")
  105. }
  106. }
  107. func TestPeerProtoEncodeMsg(t *testing.T) {
  108. defer testlog(t).detach()
  109. proto := Protocol{
  110. Name: "a",
  111. Length: 2,
  112. Run: func(peer *Peer, rw MsgReadWriter) error {
  113. if err := rw.EncodeMsg(2); err == nil {
  114. t.Error("expected error for out-of-range msg code, got nil")
  115. }
  116. if err := rw.EncodeMsg(1); err != nil {
  117. t.Errorf("write error: %v", err)
  118. }
  119. return nil
  120. },
  121. }
  122. net, peer, _ := testPeer([]Protocol{proto})
  123. defer net.Close()
  124. peer.startSubprotocols([]Cap{proto.cap()})
  125. bufr := bufio.NewReader(net)
  126. msg, err := readMsg(bufr)
  127. if err != nil {
  128. t.Errorf("read error: %v", err)
  129. }
  130. if msg.Code != 17 {
  131. t.Errorf("incorrect message code: got %d, expected %d", msg.Code, 17)
  132. }
  133. }
  134. func TestPeerWrite(t *testing.T) {
  135. defer testlog(t).detach()
  136. net, peer, peerErr := testPeer([]Protocol{discard})
  137. defer net.Close()
  138. peer.startSubprotocols([]Cap{discard.cap()})
  139. // test write errors
  140. if err := peer.writeProtoMsg("b", NewMsg(3)); err == nil {
  141. t.Errorf("expected error for unknown protocol, got nil")
  142. }
  143. if err := peer.writeProtoMsg("discard", NewMsg(8)); err == nil {
  144. t.Errorf("expected error for out-of-range msg code, got nil")
  145. } else if perr, ok := err.(*peerError); !ok || perr.Code != errInvalidMsgCode {
  146. t.Errorf("wrong error for out-of-range msg code, got %#v", err)
  147. }
  148. // setup for reading the message on the other end
  149. read := make(chan struct{})
  150. go func() {
  151. bufr := bufio.NewReader(net)
  152. msg, err := readMsg(bufr)
  153. if err != nil {
  154. t.Errorf("read error: %v", err)
  155. } else if msg.Code != 16 {
  156. t.Errorf("wrong code, got %d, expected %d", msg.Code, 16)
  157. }
  158. msg.Discard()
  159. close(read)
  160. }()
  161. // test succcessful write
  162. if err := peer.writeProtoMsg("discard", NewMsg(0)); err != nil {
  163. t.Errorf("expect no error for known protocol: %v", err)
  164. }
  165. select {
  166. case <-read:
  167. case err := <-peerErr:
  168. t.Fatalf("peer stopped: %v", err)
  169. }
  170. }
  171. func TestPeerActivity(t *testing.T) {
  172. // shorten inactivityTimeout while this test is running
  173. oldT := inactivityTimeout
  174. defer func() { inactivityTimeout = oldT }()
  175. inactivityTimeout = 20 * time.Millisecond
  176. net, peer, peerErr := testPeer([]Protocol{discard})
  177. defer net.Close()
  178. peer.startSubprotocols([]Cap{discard.cap()})
  179. sub := peer.activity.Subscribe(time.Time{})
  180. defer sub.Unsubscribe()
  181. for i := 0; i < 6; i++ {
  182. writeMsg(net, NewMsg(16))
  183. select {
  184. case <-sub.Chan():
  185. case <-time.After(inactivityTimeout / 2):
  186. t.Fatal("no event within ", inactivityTimeout/2)
  187. case err := <-peerErr:
  188. t.Fatal("peer error", err)
  189. }
  190. }
  191. select {
  192. case <-time.After(inactivityTimeout * 2):
  193. case <-sub.Chan():
  194. t.Fatal("got activity event while connection was inactive")
  195. case err := <-peerErr:
  196. t.Fatal("peer error", err)
  197. }
  198. }