connection_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package p2p
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "net"
  7. "testing"
  8. "time"
  9. )
  10. type TestNetworkConnection struct {
  11. in chan []byte
  12. current []byte
  13. Out [][]byte
  14. addr net.Addr
  15. }
  16. func NewTestNetworkConnection(addr net.Addr) *TestNetworkConnection {
  17. return &TestNetworkConnection{
  18. in: make(chan []byte),
  19. current: []byte{},
  20. Out: [][]byte{},
  21. addr: addr,
  22. }
  23. }
  24. func (self *TestNetworkConnection) In(latency time.Duration, packets ...[]byte) {
  25. time.Sleep(latency)
  26. for _, s := range packets {
  27. self.in <- s
  28. }
  29. }
  30. func (self *TestNetworkConnection) Read(buff []byte) (n int, err error) {
  31. if len(self.current) == 0 {
  32. select {
  33. case self.current = <-self.in:
  34. default:
  35. return 0, io.EOF
  36. }
  37. }
  38. length := len(self.current)
  39. if length > len(buff) {
  40. copy(buff[:], self.current[:len(buff)])
  41. self.current = self.current[len(buff):]
  42. return len(buff), nil
  43. } else {
  44. copy(buff[:length], self.current[:])
  45. self.current = []byte{}
  46. return length, io.EOF
  47. }
  48. }
  49. func (self *TestNetworkConnection) Write(buff []byte) (n int, err error) {
  50. self.Out = append(self.Out, buff)
  51. fmt.Printf("net write %v\n%v\n", len(self.Out), buff)
  52. return len(buff), nil
  53. }
  54. func (self *TestNetworkConnection) Close() (err error) {
  55. return
  56. }
  57. func (self *TestNetworkConnection) LocalAddr() (addr net.Addr) {
  58. return
  59. }
  60. func (self *TestNetworkConnection) RemoteAddr() (addr net.Addr) {
  61. return self.addr
  62. }
  63. func (self *TestNetworkConnection) SetDeadline(t time.Time) (err error) {
  64. return
  65. }
  66. func (self *TestNetworkConnection) SetReadDeadline(t time.Time) (err error) {
  67. return
  68. }
  69. func (self *TestNetworkConnection) SetWriteDeadline(t time.Time) (err error) {
  70. return
  71. }
  72. func setupConnection() (*Connection, *TestNetworkConnection) {
  73. addr := &TestAddr{"test:30303"}
  74. net := NewTestNetworkConnection(addr)
  75. conn := NewConnection(net, NewPeerErrorChannel())
  76. conn.Open()
  77. return conn, net
  78. }
  79. func TestReadingNilPacket(t *testing.T) {
  80. conn, net := setupConnection()
  81. go net.In(0, []byte{})
  82. // time.Sleep(10 * time.Millisecond)
  83. select {
  84. case packet := <-conn.Read():
  85. t.Errorf("read %v", packet)
  86. case err := <-conn.Error():
  87. t.Errorf("incorrect error %v", err)
  88. default:
  89. }
  90. conn.Close()
  91. }
  92. func TestReadingShortPacket(t *testing.T) {
  93. conn, net := setupConnection()
  94. go net.In(0, []byte{0})
  95. select {
  96. case packet := <-conn.Read():
  97. t.Errorf("read %v", packet)
  98. case err := <-conn.Error():
  99. if err.Code != PacketTooShort {
  100. t.Errorf("incorrect error %v, expected %v", err.Code, PacketTooShort)
  101. }
  102. }
  103. conn.Close()
  104. }
  105. func TestReadingInvalidPacket(t *testing.T) {
  106. conn, net := setupConnection()
  107. go net.In(0, []byte{1, 0, 0, 0, 0, 0, 0, 0})
  108. select {
  109. case packet := <-conn.Read():
  110. t.Errorf("read %v", packet)
  111. case err := <-conn.Error():
  112. if err.Code != MagicTokenMismatch {
  113. t.Errorf("incorrect error %v, expected %v", err.Code, MagicTokenMismatch)
  114. }
  115. }
  116. conn.Close()
  117. }
  118. func TestReadingInvalidPayload(t *testing.T) {
  119. conn, net := setupConnection()
  120. go net.In(0, []byte{34, 64, 8, 145, 0, 0, 0, 2, 0})
  121. select {
  122. case packet := <-conn.Read():
  123. t.Errorf("read %v", packet)
  124. case err := <-conn.Error():
  125. if err.Code != PayloadTooShort {
  126. t.Errorf("incorrect error %v, expected %v", err.Code, PayloadTooShort)
  127. }
  128. }
  129. conn.Close()
  130. }
  131. func TestReadingEmptyPayload(t *testing.T) {
  132. conn, net := setupConnection()
  133. go net.In(0, []byte{34, 64, 8, 145, 0, 0, 0, 0})
  134. time.Sleep(10 * time.Millisecond)
  135. select {
  136. case packet := <-conn.Read():
  137. t.Errorf("read %v", packet)
  138. default:
  139. }
  140. select {
  141. case err := <-conn.Error():
  142. code := err.Code
  143. if code != EmptyPayload {
  144. t.Errorf("incorrect error, expected EmptyPayload, got %v", code)
  145. }
  146. default:
  147. t.Errorf("no error, expected EmptyPayload")
  148. }
  149. conn.Close()
  150. }
  151. func TestReadingCompletePacket(t *testing.T) {
  152. conn, net := setupConnection()
  153. go net.In(0, []byte{34, 64, 8, 145, 0, 0, 0, 1, 1})
  154. time.Sleep(10 * time.Millisecond)
  155. select {
  156. case packet := <-conn.Read():
  157. if bytes.Compare(packet, []byte{1}) != 0 {
  158. t.Errorf("incorrect payload read")
  159. }
  160. case err := <-conn.Error():
  161. t.Errorf("incorrect error %v", err)
  162. default:
  163. t.Errorf("nothing read")
  164. }
  165. conn.Close()
  166. }
  167. func TestReadingTwoCompletePackets(t *testing.T) {
  168. conn, net := setupConnection()
  169. go net.In(0, []byte{34, 64, 8, 145, 0, 0, 0, 1, 0, 34, 64, 8, 145, 0, 0, 0, 1, 1})
  170. for i := 0; i < 2; i++ {
  171. time.Sleep(10 * time.Millisecond)
  172. select {
  173. case packet := <-conn.Read():
  174. if bytes.Compare(packet, []byte{byte(i)}) != 0 {
  175. t.Errorf("incorrect payload read")
  176. }
  177. case err := <-conn.Error():
  178. t.Errorf("incorrect error %v", err)
  179. default:
  180. t.Errorf("nothing read")
  181. }
  182. }
  183. conn.Close()
  184. }
  185. func TestWriting(t *testing.T) {
  186. conn, net := setupConnection()
  187. conn.Write() <- []byte{0}
  188. time.Sleep(10 * time.Millisecond)
  189. if len(net.Out) == 0 {
  190. t.Errorf("no output")
  191. } else {
  192. out := net.Out[0]
  193. if bytes.Compare(out, []byte{34, 64, 8, 145, 0, 0, 0, 1, 0}) != 0 {
  194. t.Errorf("incorrect packet %v", out)
  195. }
  196. }
  197. conn.Close()
  198. }
  199. // hello packet with client id ABC: 0x22 40 08 91 00 00 00 08 84 00 00 00 43414243