server_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. // Copyright 2014 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package p2p
  17. import (
  18. "crypto/ecdsa"
  19. "errors"
  20. "math/rand"
  21. "net"
  22. "reflect"
  23. "testing"
  24. "time"
  25. "github.com/ethereum/go-ethereum/crypto"
  26. "github.com/ethereum/go-ethereum/crypto/sha3"
  27. "github.com/ethereum/go-ethereum/log"
  28. "github.com/ethereum/go-ethereum/p2p/discover"
  29. )
  30. func init() {
  31. // log.Root().SetHandler(log.LvlFilterHandler(log.LvlError, log.StreamHandler(os.Stderr, log.TerminalFormat(false))))
  32. }
  33. type testTransport struct {
  34. id discover.NodeID
  35. *rlpx
  36. closeErr error
  37. }
  38. func newTestTransport(id discover.NodeID, fd net.Conn) transport {
  39. wrapped := newRLPX(fd).(*rlpx)
  40. wrapped.rw = newRLPXFrameRW(fd, secrets{
  41. MAC: zero16,
  42. AES: zero16,
  43. IngressMAC: sha3.NewKeccak256(),
  44. EgressMAC: sha3.NewKeccak256(),
  45. })
  46. return &testTransport{id: id, rlpx: wrapped}
  47. }
  48. func (c *testTransport) doEncHandshake(prv *ecdsa.PrivateKey, dialDest *discover.Node) (discover.NodeID, error) {
  49. return c.id, nil
  50. }
  51. func (c *testTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) {
  52. return &protoHandshake{ID: c.id, Name: "test"}, nil
  53. }
  54. func (c *testTransport) close(err error) {
  55. c.rlpx.fd.Close()
  56. c.closeErr = err
  57. }
  58. func startTestServer(t *testing.T, id discover.NodeID, pf func(*Peer)) *Server {
  59. config := Config{
  60. Name: "test",
  61. MaxPeers: 10,
  62. ListenAddr: "127.0.0.1:0",
  63. PrivateKey: newkey(),
  64. }
  65. server := &Server{
  66. Config: config,
  67. newPeerHook: pf,
  68. newTransport: func(fd net.Conn) transport { return newTestTransport(id, fd) },
  69. }
  70. if err := server.Start(); err != nil {
  71. t.Fatalf("Could not start server: %v", err)
  72. }
  73. return server
  74. }
  75. func TestServerListen(t *testing.T) {
  76. // start the test server
  77. connected := make(chan *Peer)
  78. remid := randomID()
  79. srv := startTestServer(t, remid, func(p *Peer) {
  80. if p.ID() != remid {
  81. t.Error("peer func called with wrong node id")
  82. }
  83. if p == nil {
  84. t.Error("peer func called with nil conn")
  85. }
  86. connected <- p
  87. })
  88. defer close(connected)
  89. defer srv.Stop()
  90. // dial the test server
  91. conn, err := net.DialTimeout("tcp", srv.ListenAddr, 5*time.Second)
  92. if err != nil {
  93. t.Fatalf("could not dial: %v", err)
  94. }
  95. defer conn.Close()
  96. select {
  97. case peer := <-connected:
  98. if peer.LocalAddr().String() != conn.RemoteAddr().String() {
  99. t.Errorf("peer started with wrong conn: got %v, want %v",
  100. peer.LocalAddr(), conn.RemoteAddr())
  101. }
  102. peers := srv.Peers()
  103. if !reflect.DeepEqual(peers, []*Peer{peer}) {
  104. t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer})
  105. }
  106. case <-time.After(1 * time.Second):
  107. t.Error("server did not accept within one second")
  108. }
  109. }
  110. func TestServerDial(t *testing.T) {
  111. // run a one-shot TCP server to handle the connection.
  112. listener, err := net.Listen("tcp", "127.0.0.1:0")
  113. if err != nil {
  114. t.Fatalf("could not setup listener: %v", err)
  115. }
  116. defer listener.Close()
  117. accepted := make(chan net.Conn)
  118. go func() {
  119. conn, err := listener.Accept()
  120. if err != nil {
  121. t.Error("accept error:", err)
  122. return
  123. }
  124. accepted <- conn
  125. }()
  126. // start the server
  127. connected := make(chan *Peer)
  128. remid := randomID()
  129. srv := startTestServer(t, remid, func(p *Peer) { connected <- p })
  130. defer close(connected)
  131. defer srv.Stop()
  132. // tell the server to connect
  133. tcpAddr := listener.Addr().(*net.TCPAddr)
  134. node := &discover.Node{ID: remid, IP: tcpAddr.IP, TCP: uint16(tcpAddr.Port)}
  135. srv.AddPeer(node)
  136. select {
  137. case conn := <-accepted:
  138. defer conn.Close()
  139. select {
  140. case peer := <-connected:
  141. if peer.ID() != remid {
  142. t.Errorf("peer has wrong id")
  143. }
  144. if peer.Name() != "test" {
  145. t.Errorf("peer has wrong name")
  146. }
  147. if peer.RemoteAddr().String() != conn.LocalAddr().String() {
  148. t.Errorf("peer started with wrong conn: got %v, want %v",
  149. peer.RemoteAddr(), conn.LocalAddr())
  150. }
  151. peers := srv.Peers()
  152. if !reflect.DeepEqual(peers, []*Peer{peer}) {
  153. t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer})
  154. }
  155. // Test AddTrustedPeer/RemoveTrustedPeer and changing Trusted flags
  156. // Particularly for race conditions on changing the flag state.
  157. if peer := srv.Peers()[0]; peer.Info().Network.Trusted {
  158. t.Errorf("peer is trusted prematurely: %v", peer)
  159. }
  160. done := make(chan bool)
  161. go func() {
  162. srv.AddTrustedPeer(node)
  163. if peer := srv.Peers()[0]; !peer.Info().Network.Trusted {
  164. t.Errorf("peer is not trusted after AddTrustedPeer: %v", peer)
  165. }
  166. srv.RemoveTrustedPeer(node)
  167. if peer := srv.Peers()[0]; peer.Info().Network.Trusted {
  168. t.Errorf("peer is trusted after RemoveTrustedPeer: %v", peer)
  169. }
  170. done <- true
  171. }()
  172. // Trigger potential race conditions
  173. peer = srv.Peers()[0]
  174. _ = peer.Inbound()
  175. _ = peer.Info()
  176. <-done
  177. case <-time.After(1 * time.Second):
  178. t.Error("server did not launch peer within one second")
  179. }
  180. case <-time.After(1 * time.Second):
  181. t.Error("server did not connect within one second")
  182. }
  183. }
  184. // This test checks that tasks generated by dialstate are
  185. // actually executed and taskdone is called for them.
  186. func TestServerTaskScheduling(t *testing.T) {
  187. var (
  188. done = make(chan *testTask)
  189. quit, returned = make(chan struct{}), make(chan struct{})
  190. tc = 0
  191. tg = taskgen{
  192. newFunc: func(running int, peers map[discover.NodeID]*Peer) []task {
  193. tc++
  194. return []task{&testTask{index: tc - 1}}
  195. },
  196. doneFunc: func(t task) {
  197. select {
  198. case done <- t.(*testTask):
  199. case <-quit:
  200. }
  201. },
  202. }
  203. )
  204. // The Server in this test isn't actually running
  205. // because we're only interested in what run does.
  206. srv := &Server{
  207. Config: Config{MaxPeers: 10},
  208. quit: make(chan struct{}),
  209. ntab: fakeTable{},
  210. running: true,
  211. log: log.New(),
  212. }
  213. srv.loopWG.Add(1)
  214. go func() {
  215. srv.run(tg)
  216. close(returned)
  217. }()
  218. var gotdone []*testTask
  219. for i := 0; i < 100; i++ {
  220. gotdone = append(gotdone, <-done)
  221. }
  222. for i, task := range gotdone {
  223. if task.index != i {
  224. t.Errorf("task %d has wrong index, got %d", i, task.index)
  225. break
  226. }
  227. if !task.called {
  228. t.Errorf("task %d was not called", i)
  229. break
  230. }
  231. }
  232. close(quit)
  233. srv.Stop()
  234. select {
  235. case <-returned:
  236. case <-time.After(500 * time.Millisecond):
  237. t.Error("Server.run did not return within 500ms")
  238. }
  239. }
  240. // This test checks that Server doesn't drop tasks,
  241. // even if newTasks returns more than the maximum number of tasks.
  242. func TestServerManyTasks(t *testing.T) {
  243. alltasks := make([]task, 300)
  244. for i := range alltasks {
  245. alltasks[i] = &testTask{index: i}
  246. }
  247. var (
  248. srv = &Server{
  249. quit: make(chan struct{}),
  250. ntab: fakeTable{},
  251. running: true,
  252. log: log.New(),
  253. }
  254. done = make(chan *testTask)
  255. start, end = 0, 0
  256. )
  257. defer srv.Stop()
  258. srv.loopWG.Add(1)
  259. go srv.run(taskgen{
  260. newFunc: func(running int, peers map[discover.NodeID]*Peer) []task {
  261. start, end = end, end+maxActiveDialTasks+10
  262. if end > len(alltasks) {
  263. end = len(alltasks)
  264. }
  265. return alltasks[start:end]
  266. },
  267. doneFunc: func(tt task) {
  268. done <- tt.(*testTask)
  269. },
  270. })
  271. doneset := make(map[int]bool)
  272. timeout := time.After(2 * time.Second)
  273. for len(doneset) < len(alltasks) {
  274. select {
  275. case tt := <-done:
  276. if doneset[tt.index] {
  277. t.Errorf("task %d got done more than once", tt.index)
  278. } else {
  279. doneset[tt.index] = true
  280. }
  281. case <-timeout:
  282. t.Errorf("%d of %d tasks got done within 2s", len(doneset), len(alltasks))
  283. for i := 0; i < len(alltasks); i++ {
  284. if !doneset[i] {
  285. t.Logf("task %d not done", i)
  286. }
  287. }
  288. return
  289. }
  290. }
  291. }
  292. type taskgen struct {
  293. newFunc func(running int, peers map[discover.NodeID]*Peer) []task
  294. doneFunc func(task)
  295. }
  296. func (tg taskgen) newTasks(running int, peers map[discover.NodeID]*Peer, now time.Time) []task {
  297. return tg.newFunc(running, peers)
  298. }
  299. func (tg taskgen) taskDone(t task, now time.Time) {
  300. tg.doneFunc(t)
  301. }
  302. func (tg taskgen) addStatic(*discover.Node) {
  303. }
  304. func (tg taskgen) removeStatic(*discover.Node) {
  305. }
  306. type testTask struct {
  307. index int
  308. called bool
  309. }
  310. func (t *testTask) Do(srv *Server) {
  311. t.called = true
  312. }
  313. // This test checks that connections are disconnected
  314. // just after the encryption handshake when the server is
  315. // at capacity. Trusted connections should still be accepted.
  316. func TestServerAtCap(t *testing.T) {
  317. trustedID := randomID()
  318. srv := &Server{
  319. Config: Config{
  320. PrivateKey: newkey(),
  321. MaxPeers: 10,
  322. NoDial: true,
  323. TrustedNodes: []*discover.Node{{ID: trustedID}},
  324. },
  325. }
  326. if err := srv.Start(); err != nil {
  327. t.Fatalf("could not start: %v", err)
  328. }
  329. defer srv.Stop()
  330. newconn := func(id discover.NodeID) *conn {
  331. fd, _ := net.Pipe()
  332. tx := newTestTransport(id, fd)
  333. return &conn{fd: fd, transport: tx, flags: inboundConn, id: id, cont: make(chan error)}
  334. }
  335. // Inject a few connections to fill up the peer set.
  336. for i := 0; i < 10; i++ {
  337. c := newconn(randomID())
  338. if err := srv.checkpoint(c, srv.addpeer); err != nil {
  339. t.Fatalf("could not add conn %d: %v", i, err)
  340. }
  341. }
  342. // Try inserting a non-trusted connection.
  343. anotherID := randomID()
  344. c := newconn(anotherID)
  345. if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers {
  346. t.Error("wrong error for insert:", err)
  347. }
  348. // Try inserting a trusted connection.
  349. c = newconn(trustedID)
  350. if err := srv.checkpoint(c, srv.posthandshake); err != nil {
  351. t.Error("unexpected error for trusted conn @posthandshake:", err)
  352. }
  353. if !c.is(trustedConn) {
  354. t.Error("Server did not set trusted flag")
  355. }
  356. // Remove from trusted set and try again
  357. srv.RemoveTrustedPeer(&discover.Node{ID: trustedID})
  358. c = newconn(trustedID)
  359. if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers {
  360. t.Error("wrong error for insert:", err)
  361. }
  362. // Add anotherID to trusted set and try again
  363. srv.AddTrustedPeer(&discover.Node{ID: anotherID})
  364. c = newconn(anotherID)
  365. if err := srv.checkpoint(c, srv.posthandshake); err != nil {
  366. t.Error("unexpected error for trusted conn @posthandshake:", err)
  367. }
  368. if !c.is(trustedConn) {
  369. t.Error("Server did not set trusted flag")
  370. }
  371. }
  372. func TestServerPeerLimits(t *testing.T) {
  373. srvkey := newkey()
  374. clientid := randomID()
  375. clientnode := &discover.Node{ID: clientid}
  376. var tp *setupTransport = &setupTransport{
  377. id: clientid,
  378. phs: &protoHandshake{
  379. ID: clientid,
  380. // Force "DiscUselessPeer" due to unmatching caps
  381. // Caps: []Cap{discard.cap()},
  382. },
  383. }
  384. var flags connFlag = dynDialedConn
  385. var dialDest *discover.Node = &discover.Node{ID: clientid}
  386. srv := &Server{
  387. Config: Config{
  388. PrivateKey: srvkey,
  389. MaxPeers: 0,
  390. NoDial: true,
  391. Protocols: []Protocol{discard},
  392. },
  393. newTransport: func(fd net.Conn) transport { return tp },
  394. log: log.New(),
  395. }
  396. if err := srv.Start(); err != nil {
  397. t.Fatalf("couldn't start server: %v", err)
  398. }
  399. defer srv.Stop()
  400. // Check that server is full (MaxPeers=0)
  401. conn, _ := net.Pipe()
  402. srv.SetupConn(conn, flags, dialDest)
  403. if tp.closeErr != DiscTooManyPeers {
  404. t.Errorf("unexpected close error: %q", tp.closeErr)
  405. }
  406. conn.Close()
  407. srv.AddTrustedPeer(clientnode)
  408. // Check that server allows a trusted peer despite being full.
  409. conn, _ = net.Pipe()
  410. srv.SetupConn(conn, flags, dialDest)
  411. if tp.closeErr == DiscTooManyPeers {
  412. t.Errorf("failed to bypass MaxPeers with trusted node: %q", tp.closeErr)
  413. }
  414. if tp.closeErr != DiscUselessPeer {
  415. t.Errorf("unexpected close error: %q", tp.closeErr)
  416. }
  417. conn.Close()
  418. srv.RemoveTrustedPeer(clientnode)
  419. // Check that server is full again.
  420. conn, _ = net.Pipe()
  421. srv.SetupConn(conn, flags, dialDest)
  422. if tp.closeErr != DiscTooManyPeers {
  423. t.Errorf("unexpected close error: %q", tp.closeErr)
  424. }
  425. conn.Close()
  426. }
  427. func TestServerSetupConn(t *testing.T) {
  428. id := randomID()
  429. srvkey := newkey()
  430. srvid := discover.PubkeyID(&srvkey.PublicKey)
  431. tests := []struct {
  432. dontstart bool
  433. tt *setupTransport
  434. flags connFlag
  435. dialDest *discover.Node
  436. wantCloseErr error
  437. wantCalls string
  438. }{
  439. {
  440. dontstart: true,
  441. tt: &setupTransport{id: id},
  442. wantCalls: "close,",
  443. wantCloseErr: errServerStopped,
  444. },
  445. {
  446. tt: &setupTransport{id: id, encHandshakeErr: errors.New("read error")},
  447. flags: inboundConn,
  448. wantCalls: "doEncHandshake,close,",
  449. wantCloseErr: errors.New("read error"),
  450. },
  451. {
  452. tt: &setupTransport{id: id},
  453. dialDest: &discover.Node{ID: randomID()},
  454. flags: dynDialedConn,
  455. wantCalls: "doEncHandshake,close,",
  456. wantCloseErr: DiscUnexpectedIdentity,
  457. },
  458. {
  459. tt: &setupTransport{id: id, phs: &protoHandshake{ID: randomID()}},
  460. dialDest: &discover.Node{ID: id},
  461. flags: dynDialedConn,
  462. wantCalls: "doEncHandshake,doProtoHandshake,close,",
  463. wantCloseErr: DiscUnexpectedIdentity,
  464. },
  465. {
  466. tt: &setupTransport{id: id, protoHandshakeErr: errors.New("foo")},
  467. dialDest: &discover.Node{ID: id},
  468. flags: dynDialedConn,
  469. wantCalls: "doEncHandshake,doProtoHandshake,close,",
  470. wantCloseErr: errors.New("foo"),
  471. },
  472. {
  473. tt: &setupTransport{id: srvid, phs: &protoHandshake{ID: srvid}},
  474. flags: inboundConn,
  475. wantCalls: "doEncHandshake,close,",
  476. wantCloseErr: DiscSelf,
  477. },
  478. {
  479. tt: &setupTransport{id: id, phs: &protoHandshake{ID: id}},
  480. flags: inboundConn,
  481. wantCalls: "doEncHandshake,doProtoHandshake,close,",
  482. wantCloseErr: DiscUselessPeer,
  483. },
  484. }
  485. for i, test := range tests {
  486. srv := &Server{
  487. Config: Config{
  488. PrivateKey: srvkey,
  489. MaxPeers: 10,
  490. NoDial: true,
  491. Protocols: []Protocol{discard},
  492. },
  493. newTransport: func(fd net.Conn) transport { return test.tt },
  494. log: log.New(),
  495. }
  496. if !test.dontstart {
  497. if err := srv.Start(); err != nil {
  498. t.Fatalf("couldn't start server: %v", err)
  499. }
  500. }
  501. p1, _ := net.Pipe()
  502. srv.SetupConn(p1, test.flags, test.dialDest)
  503. if !reflect.DeepEqual(test.tt.closeErr, test.wantCloseErr) {
  504. t.Errorf("test %d: close error mismatch: got %q, want %q", i, test.tt.closeErr, test.wantCloseErr)
  505. }
  506. if test.tt.calls != test.wantCalls {
  507. t.Errorf("test %d: calls mismatch: got %q, want %q", i, test.tt.calls, test.wantCalls)
  508. }
  509. }
  510. }
  511. type setupTransport struct {
  512. id discover.NodeID
  513. encHandshakeErr error
  514. phs *protoHandshake
  515. protoHandshakeErr error
  516. calls string
  517. closeErr error
  518. }
  519. func (c *setupTransport) doEncHandshake(prv *ecdsa.PrivateKey, dialDest *discover.Node) (discover.NodeID, error) {
  520. c.calls += "doEncHandshake,"
  521. return c.id, c.encHandshakeErr
  522. }
  523. func (c *setupTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) {
  524. c.calls += "doProtoHandshake,"
  525. if c.protoHandshakeErr != nil {
  526. return nil, c.protoHandshakeErr
  527. }
  528. return c.phs, nil
  529. }
  530. func (c *setupTransport) close(err error) {
  531. c.calls += "close,"
  532. c.closeErr = err
  533. }
  534. // setupConn shouldn't write to/read from the connection.
  535. func (c *setupTransport) WriteMsg(Msg) error {
  536. panic("WriteMsg called on setupTransport")
  537. }
  538. func (c *setupTransport) ReadMsg() (Msg, error) {
  539. panic("ReadMsg called on setupTransport")
  540. }
  541. func newkey() *ecdsa.PrivateKey {
  542. key, err := crypto.GenerateKey()
  543. if err != nil {
  544. panic("couldn't generate key: " + err.Error())
  545. }
  546. return key
  547. }
  548. func randomID() (id discover.NodeID) {
  549. for i := range id {
  550. id[i] = byte(rand.Intn(255))
  551. }
  552. return id
  553. }