server_test.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. package p2p
  2. import (
  3. "fmt"
  4. "io"
  5. "net"
  6. "testing"
  7. "time"
  8. )
  9. type TestNetwork struct {
  10. connections map[string]*TestNetworkConnection
  11. dialer Dialer
  12. maxinbound int
  13. }
  14. func NewTestNetwork(maxinbound int) *TestNetwork {
  15. connections := make(map[string]*TestNetworkConnection)
  16. return &TestNetwork{
  17. connections: connections,
  18. dialer: &TestDialer{connections},
  19. maxinbound: maxinbound,
  20. }
  21. }
  22. func (self *TestNetwork) Dialer(addr net.Addr) (Dialer, error) {
  23. return self.dialer, nil
  24. }
  25. func (self *TestNetwork) Listener(addr net.Addr) (net.Listener, error) {
  26. return &TestListener{
  27. connections: self.connections,
  28. addr: addr,
  29. max: self.maxinbound,
  30. close: make(chan struct{}),
  31. }, nil
  32. }
  33. func (self *TestNetwork) Start() error {
  34. return nil
  35. }
  36. func (self *TestNetwork) NewAddr(string, int) (addr net.Addr, err error) {
  37. return
  38. }
  39. func (self *TestNetwork) ParseAddr(string) (addr net.Addr, err error) {
  40. return
  41. }
  42. type TestAddr struct {
  43. name string
  44. }
  45. func (self *TestAddr) String() string {
  46. return self.name
  47. }
  48. func (*TestAddr) Network() string {
  49. return "test"
  50. }
  51. type TestDialer struct {
  52. connections map[string]*TestNetworkConnection
  53. }
  54. func (self *TestDialer) Dial(network string, addr string) (conn net.Conn, err error) {
  55. address := &TestAddr{addr}
  56. tconn := NewTestNetworkConnection(address)
  57. self.connections[addr] = tconn
  58. conn = net.Conn(tconn)
  59. return
  60. }
  61. type TestListener struct {
  62. connections map[string]*TestNetworkConnection
  63. addr net.Addr
  64. max int
  65. i int
  66. close chan struct{}
  67. }
  68. func (self *TestListener) Accept() (net.Conn, error) {
  69. self.i++
  70. if self.i > self.max {
  71. <-self.close
  72. return nil, io.EOF
  73. }
  74. addr := &TestAddr{fmt.Sprintf("inboundpeer-%d", self.i)}
  75. tconn := NewTestNetworkConnection(addr)
  76. key := tconn.RemoteAddr().String()
  77. self.connections[key] = tconn
  78. fmt.Printf("accepted connection from: %v \n", addr)
  79. return tconn, nil
  80. }
  81. func (self *TestListener) Close() error {
  82. close(self.close)
  83. return nil
  84. }
  85. func (self *TestListener) Addr() net.Addr {
  86. return self.addr
  87. }
  88. type TestNetworkConnection struct {
  89. in chan []byte
  90. close chan struct{}
  91. current []byte
  92. Out [][]byte
  93. addr net.Addr
  94. }
  95. func NewTestNetworkConnection(addr net.Addr) *TestNetworkConnection {
  96. return &TestNetworkConnection{
  97. in: make(chan []byte),
  98. close: make(chan struct{}),
  99. current: []byte{},
  100. Out: [][]byte{},
  101. addr: addr,
  102. }
  103. }
  104. func (self *TestNetworkConnection) In(latency time.Duration, packets ...[]byte) {
  105. time.Sleep(latency)
  106. for _, s := range packets {
  107. self.in <- s
  108. }
  109. }
  110. func (self *TestNetworkConnection) Read(buff []byte) (n int, err error) {
  111. if len(self.current) == 0 {
  112. var ok bool
  113. select {
  114. case self.current, ok = <-self.in:
  115. if !ok {
  116. return 0, io.EOF
  117. }
  118. case <-self.close:
  119. return 0, io.EOF
  120. }
  121. }
  122. length := len(self.current)
  123. if length > len(buff) {
  124. copy(buff[:], self.current[:len(buff)])
  125. self.current = self.current[len(buff):]
  126. return len(buff), nil
  127. } else {
  128. copy(buff[:length], self.current[:])
  129. self.current = []byte{}
  130. return length, io.EOF
  131. }
  132. }
  133. func (self *TestNetworkConnection) Write(buff []byte) (n int, err error) {
  134. self.Out = append(self.Out, buff)
  135. fmt.Printf("net write(%d): %x\n", len(self.Out), buff)
  136. return len(buff), nil
  137. }
  138. func (self *TestNetworkConnection) Close() error {
  139. close(self.close)
  140. return nil
  141. }
  142. func (self *TestNetworkConnection) LocalAddr() (addr net.Addr) {
  143. return
  144. }
  145. func (self *TestNetworkConnection) RemoteAddr() (addr net.Addr) {
  146. return self.addr
  147. }
  148. func (self *TestNetworkConnection) SetDeadline(t time.Time) (err error) {
  149. return
  150. }
  151. func (self *TestNetworkConnection) SetReadDeadline(t time.Time) (err error) {
  152. return
  153. }
  154. func (self *TestNetworkConnection) SetWriteDeadline(t time.Time) (err error) {
  155. return
  156. }
  157. func SetupTestServer(handlers Handlers) (network *TestNetwork, server *Server) {
  158. network = NewTestNetwork(1)
  159. addr := &TestAddr{"test:30303"}
  160. identity := NewSimpleClientIdentity("clientIdentifier", "version", "customIdentifier", "pubkey")
  161. maxPeers := 2
  162. if handlers == nil {
  163. handlers = make(Handlers)
  164. }
  165. blackist := NewBlacklist()
  166. server = New(network, addr, identity, handlers, maxPeers, blackist)
  167. fmt.Println(server.identity.Pubkey())
  168. return
  169. }
  170. func TestServerListener(t *testing.T) {
  171. t.SkipNow()
  172. network, server := SetupTestServer(nil)
  173. server.Start(true, false)
  174. time.Sleep(10 * time.Millisecond)
  175. server.Stop()
  176. peer1, ok := network.connections["inboundpeer-1"]
  177. if !ok {
  178. t.Error("not found inbound peer 1")
  179. } else {
  180. if len(peer1.Out) != 2 {
  181. t.Errorf("wrong number of writes to peer 1: got %d, want %d", len(peer1.Out), 2)
  182. }
  183. }
  184. }
  185. func TestServerDialer(t *testing.T) {
  186. network, server := SetupTestServer(nil)
  187. server.Start(false, true)
  188. server.peerConnect <- &TestAddr{"outboundpeer-1"}
  189. time.Sleep(10 * time.Millisecond)
  190. server.Stop()
  191. peer1, ok := network.connections["outboundpeer-1"]
  192. if !ok {
  193. t.Error("not found outbound peer 1")
  194. } else {
  195. if len(peer1.Out) != 2 {
  196. t.Errorf("wrong number of writes to peer 1: got %d, want %d", len(peer1.Out), 2)
  197. }
  198. }
  199. }
  200. // func TestServerBroadcast(t *testing.T) {
  201. // handlers := make(Handlers)
  202. // testProtocol := &TestProtocol{Msgs: []*Msg{}}
  203. // handlers["aaa"] = func(p *Peer) Protocol { return testProtocol }
  204. // network, server := SetupTestServer(handlers)
  205. // server.Start(true, true)
  206. // server.peerConnect <- &TestAddr{"outboundpeer-1"}
  207. // time.Sleep(10 * time.Millisecond)
  208. // msg := NewMsg(0)
  209. // server.Broadcast("", msg)
  210. // packet := Packet(0, 0)
  211. // time.Sleep(10 * time.Millisecond)
  212. // server.Stop()
  213. // peer1, ok := network.connections["outboundpeer-1"]
  214. // if !ok {
  215. // t.Error("not found outbound peer 1")
  216. // } else {
  217. // fmt.Printf("out: %v\n", peer1.Out)
  218. // if len(peer1.Out) != 3 {
  219. // t.Errorf("not enough messages sent to peer 1: %v ", len(peer1.Out))
  220. // } else {
  221. // if bytes.Compare(peer1.Out[1], packet) != 0 {
  222. // t.Errorf("incorrect broadcast packet %v != %v", peer1.Out[1], packet)
  223. // }
  224. // }
  225. // }
  226. // peer2, ok := network.connections["inboundpeer-1"]
  227. // if !ok {
  228. // t.Error("not found inbound peer 2")
  229. // } else {
  230. // fmt.Printf("out: %v\n", peer2.Out)
  231. // if len(peer1.Out) != 3 {
  232. // t.Errorf("not enough messages sent to peer 2: %v ", len(peer2.Out))
  233. // } else {
  234. // if bytes.Compare(peer2.Out[1], packet) != 0 {
  235. // t.Errorf("incorrect broadcast packet %v != %v", peer2.Out[1], packet)
  236. // }
  237. // }
  238. // }
  239. // }
  240. func TestServerPeersMessage(t *testing.T) {
  241. t.SkipNow()
  242. _, server := SetupTestServer(nil)
  243. server.Start(true, true)
  244. defer server.Stop()
  245. server.peerConnect <- &TestAddr{"outboundpeer-1"}
  246. time.Sleep(2000 * time.Millisecond)
  247. pl := server.encodedPeerList()
  248. if pl == nil {
  249. t.Errorf("expect non-nil peer list")
  250. }
  251. if c := server.PeerCount(); c != 2 {
  252. t.Errorf("expect 2 peers, got %v", c)
  253. }
  254. }