server_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  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. "io"
  21. "math/rand"
  22. "net"
  23. "reflect"
  24. "testing"
  25. "time"
  26. "github.com/ethereum/go-ethereum/crypto"
  27. "github.com/ethereum/go-ethereum/internal/testlog"
  28. "github.com/ethereum/go-ethereum/log"
  29. "github.com/ethereum/go-ethereum/p2p/enode"
  30. "github.com/ethereum/go-ethereum/p2p/enr"
  31. "golang.org/x/crypto/sha3"
  32. )
  33. // func init() {
  34. // log.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(false))))
  35. // }
  36. type testTransport struct {
  37. rpub *ecdsa.PublicKey
  38. *rlpx
  39. closeErr error
  40. }
  41. func newTestTransport(rpub *ecdsa.PublicKey, fd net.Conn) transport {
  42. wrapped := newRLPX(fd).(*rlpx)
  43. wrapped.rw = newRLPXFrameRW(fd, secrets{
  44. MAC: zero16,
  45. AES: zero16,
  46. IngressMAC: sha3.NewLegacyKeccak256(),
  47. EgressMAC: sha3.NewLegacyKeccak256(),
  48. })
  49. return &testTransport{rpub: rpub, rlpx: wrapped}
  50. }
  51. func (c *testTransport) doEncHandshake(prv *ecdsa.PrivateKey, dialDest *ecdsa.PublicKey) (*ecdsa.PublicKey, error) {
  52. return c.rpub, nil
  53. }
  54. func (c *testTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) {
  55. pubkey := crypto.FromECDSAPub(c.rpub)[1:]
  56. return &protoHandshake{ID: pubkey, Name: "test"}, nil
  57. }
  58. func (c *testTransport) close(err error) {
  59. c.rlpx.fd.Close()
  60. c.closeErr = err
  61. }
  62. func startTestServer(t *testing.T, remoteKey *ecdsa.PublicKey, pf func(*Peer)) *Server {
  63. config := Config{
  64. Name: "test",
  65. MaxPeers: 10,
  66. ListenAddr: "127.0.0.1:0",
  67. PrivateKey: newkey(),
  68. Logger: testlog.Logger(t, log.LvlTrace),
  69. }
  70. server := &Server{
  71. Config: config,
  72. newPeerHook: pf,
  73. newTransport: func(fd net.Conn) transport { return newTestTransport(remoteKey, fd) },
  74. }
  75. if err := server.Start(); err != nil {
  76. t.Fatalf("Could not start server: %v", err)
  77. }
  78. return server
  79. }
  80. func TestServerListen(t *testing.T) {
  81. // start the test server
  82. connected := make(chan *Peer)
  83. remid := &newkey().PublicKey
  84. srv := startTestServer(t, remid, func(p *Peer) {
  85. if p.ID() != enode.PubkeyToIDV4(remid) {
  86. t.Error("peer func called with wrong node id")
  87. }
  88. connected <- p
  89. })
  90. defer close(connected)
  91. defer srv.Stop()
  92. // dial the test server
  93. conn, err := net.DialTimeout("tcp", srv.ListenAddr, 5*time.Second)
  94. if err != nil {
  95. t.Fatalf("could not dial: %v", err)
  96. }
  97. defer conn.Close()
  98. select {
  99. case peer := <-connected:
  100. if peer.LocalAddr().String() != conn.RemoteAddr().String() {
  101. t.Errorf("peer started with wrong conn: got %v, want %v",
  102. peer.LocalAddr(), conn.RemoteAddr())
  103. }
  104. peers := srv.Peers()
  105. if !reflect.DeepEqual(peers, []*Peer{peer}) {
  106. t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer})
  107. }
  108. case <-time.After(1 * time.Second):
  109. t.Error("server did not accept within one second")
  110. }
  111. }
  112. func TestServerDial(t *testing.T) {
  113. // run a one-shot TCP server to handle the connection.
  114. listener, err := net.Listen("tcp", "127.0.0.1:0")
  115. if err != nil {
  116. t.Fatalf("could not setup listener: %v", err)
  117. }
  118. defer listener.Close()
  119. accepted := make(chan net.Conn)
  120. go func() {
  121. conn, err := listener.Accept()
  122. if err != nil {
  123. t.Error("accept error:", err)
  124. return
  125. }
  126. accepted <- conn
  127. }()
  128. // start the server
  129. connected := make(chan *Peer)
  130. remid := &newkey().PublicKey
  131. srv := startTestServer(t, remid, func(p *Peer) { connected <- p })
  132. defer close(connected)
  133. defer srv.Stop()
  134. // tell the server to connect
  135. tcpAddr := listener.Addr().(*net.TCPAddr)
  136. node := enode.NewV4(remid, tcpAddr.IP, tcpAddr.Port, 0)
  137. srv.AddPeer(node)
  138. select {
  139. case conn := <-accepted:
  140. defer conn.Close()
  141. select {
  142. case peer := <-connected:
  143. if peer.ID() != enode.PubkeyToIDV4(remid) {
  144. t.Errorf("peer has wrong id")
  145. }
  146. if peer.Name() != "test" {
  147. t.Errorf("peer has wrong name")
  148. }
  149. if peer.RemoteAddr().String() != conn.LocalAddr().String() {
  150. t.Errorf("peer started with wrong conn: got %v, want %v",
  151. peer.RemoteAddr(), conn.LocalAddr())
  152. }
  153. peers := srv.Peers()
  154. if !reflect.DeepEqual(peers, []*Peer{peer}) {
  155. t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer})
  156. }
  157. // Test AddTrustedPeer/RemoveTrustedPeer and changing Trusted flags
  158. // Particularly for race conditions on changing the flag state.
  159. if peer := srv.Peers()[0]; peer.Info().Network.Trusted {
  160. t.Errorf("peer is trusted prematurely: %v", peer)
  161. }
  162. done := make(chan bool)
  163. go func() {
  164. srv.AddTrustedPeer(node)
  165. if peer := srv.Peers()[0]; !peer.Info().Network.Trusted {
  166. t.Errorf("peer is not trusted after AddTrustedPeer: %v", peer)
  167. }
  168. srv.RemoveTrustedPeer(node)
  169. if peer := srv.Peers()[0]; peer.Info().Network.Trusted {
  170. t.Errorf("peer is trusted after RemoveTrustedPeer: %v", peer)
  171. }
  172. done <- true
  173. }()
  174. // Trigger potential race conditions
  175. peer = srv.Peers()[0]
  176. _ = peer.Inbound()
  177. _ = peer.Info()
  178. <-done
  179. case <-time.After(1 * time.Second):
  180. t.Error("server did not launch peer within one second")
  181. }
  182. case <-time.After(1 * time.Second):
  183. t.Error("server did not connect within one second")
  184. }
  185. }
  186. // This test checks that tasks generated by dialstate are
  187. // actually executed and taskdone is called for them.
  188. func TestServerTaskScheduling(t *testing.T) {
  189. var (
  190. done = make(chan *testTask)
  191. quit, returned = make(chan struct{}), make(chan struct{})
  192. tc = 0
  193. tg = taskgen{
  194. newFunc: func(running int, peers map[enode.ID]*Peer) []task {
  195. tc++
  196. return []task{&testTask{index: tc - 1}}
  197. },
  198. doneFunc: func(t task) {
  199. select {
  200. case done <- t.(*testTask):
  201. case <-quit:
  202. }
  203. },
  204. }
  205. )
  206. // The Server in this test isn't actually running
  207. // because we're only interested in what run does.
  208. db, _ := enode.OpenDB("")
  209. srv := &Server{
  210. Config: Config{MaxPeers: 10},
  211. localnode: enode.NewLocalNode(db, newkey()),
  212. nodedb: db,
  213. discmix: enode.NewFairMix(0),
  214. quit: make(chan struct{}),
  215. running: true,
  216. log: log.New(),
  217. }
  218. srv.loopWG.Add(1)
  219. go func() {
  220. srv.run(tg)
  221. close(returned)
  222. }()
  223. var gotdone []*testTask
  224. for i := 0; i < 100; i++ {
  225. gotdone = append(gotdone, <-done)
  226. }
  227. for i, task := range gotdone {
  228. if task.index != i {
  229. t.Errorf("task %d has wrong index, got %d", i, task.index)
  230. break
  231. }
  232. if !task.called {
  233. t.Errorf("task %d was not called", i)
  234. break
  235. }
  236. }
  237. close(quit)
  238. srv.Stop()
  239. select {
  240. case <-returned:
  241. case <-time.After(500 * time.Millisecond):
  242. t.Error("Server.run did not return within 500ms")
  243. }
  244. }
  245. // This test checks that Server doesn't drop tasks,
  246. // even if newTasks returns more than the maximum number of tasks.
  247. func TestServerManyTasks(t *testing.T) {
  248. alltasks := make([]task, 300)
  249. for i := range alltasks {
  250. alltasks[i] = &testTask{index: i}
  251. }
  252. var (
  253. db, _ = enode.OpenDB("")
  254. srv = &Server{
  255. quit: make(chan struct{}),
  256. localnode: enode.NewLocalNode(db, newkey()),
  257. nodedb: db,
  258. running: true,
  259. log: log.New(),
  260. discmix: enode.NewFairMix(0),
  261. }
  262. done = make(chan *testTask)
  263. start, end = 0, 0
  264. )
  265. defer srv.Stop()
  266. srv.loopWG.Add(1)
  267. go srv.run(taskgen{
  268. newFunc: func(running int, peers map[enode.ID]*Peer) []task {
  269. start, end = end, end+maxActiveDialTasks+10
  270. if end > len(alltasks) {
  271. end = len(alltasks)
  272. }
  273. return alltasks[start:end]
  274. },
  275. doneFunc: func(tt task) {
  276. done <- tt.(*testTask)
  277. },
  278. })
  279. doneset := make(map[int]bool)
  280. timeout := time.After(2 * time.Second)
  281. for len(doneset) < len(alltasks) {
  282. select {
  283. case tt := <-done:
  284. if doneset[tt.index] {
  285. t.Errorf("task %d got done more than once", tt.index)
  286. } else {
  287. doneset[tt.index] = true
  288. }
  289. case <-timeout:
  290. t.Errorf("%d of %d tasks got done within 2s", len(doneset), len(alltasks))
  291. for i := 0; i < len(alltasks); i++ {
  292. if !doneset[i] {
  293. t.Logf("task %d not done", i)
  294. }
  295. }
  296. return
  297. }
  298. }
  299. }
  300. type taskgen struct {
  301. newFunc func(running int, peers map[enode.ID]*Peer) []task
  302. doneFunc func(task)
  303. }
  304. func (tg taskgen) newTasks(running int, peers map[enode.ID]*Peer, now time.Time) []task {
  305. return tg.newFunc(running, peers)
  306. }
  307. func (tg taskgen) taskDone(t task, now time.Time) {
  308. tg.doneFunc(t)
  309. }
  310. func (tg taskgen) addStatic(*enode.Node) {
  311. }
  312. func (tg taskgen) removeStatic(*enode.Node) {
  313. }
  314. type testTask struct {
  315. index int
  316. called bool
  317. }
  318. func (t *testTask) Do(srv *Server) {
  319. t.called = true
  320. }
  321. // This test checks that connections are disconnected
  322. // just after the encryption handshake when the server is
  323. // at capacity. Trusted connections should still be accepted.
  324. func TestServerAtCap(t *testing.T) {
  325. trustedNode := newkey()
  326. trustedID := enode.PubkeyToIDV4(&trustedNode.PublicKey)
  327. srv := &Server{
  328. Config: Config{
  329. PrivateKey: newkey(),
  330. MaxPeers: 10,
  331. NoDial: true,
  332. NoDiscovery: true,
  333. TrustedNodes: []*enode.Node{newNode(trustedID, nil)},
  334. },
  335. }
  336. if err := srv.Start(); err != nil {
  337. t.Fatalf("could not start: %v", err)
  338. }
  339. defer srv.Stop()
  340. newconn := func(id enode.ID) *conn {
  341. fd, _ := net.Pipe()
  342. tx := newTestTransport(&trustedNode.PublicKey, fd)
  343. node := enode.SignNull(new(enr.Record), id)
  344. return &conn{fd: fd, transport: tx, flags: inboundConn, node: node, cont: make(chan error)}
  345. }
  346. // Inject a few connections to fill up the peer set.
  347. for i := 0; i < 10; i++ {
  348. c := newconn(randomID())
  349. if err := srv.checkpoint(c, srv.checkpointAddPeer); err != nil {
  350. t.Fatalf("could not add conn %d: %v", i, err)
  351. }
  352. }
  353. // Try inserting a non-trusted connection.
  354. anotherID := randomID()
  355. c := newconn(anotherID)
  356. if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers {
  357. t.Error("wrong error for insert:", err)
  358. }
  359. // Try inserting a trusted connection.
  360. c = newconn(trustedID)
  361. if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil {
  362. t.Error("unexpected error for trusted conn @posthandshake:", err)
  363. }
  364. if !c.is(trustedConn) {
  365. t.Error("Server did not set trusted flag")
  366. }
  367. // Remove from trusted set and try again
  368. srv.RemoveTrustedPeer(newNode(trustedID, nil))
  369. c = newconn(trustedID)
  370. if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers {
  371. t.Error("wrong error for insert:", err)
  372. }
  373. // Add anotherID to trusted set and try again
  374. srv.AddTrustedPeer(newNode(anotherID, nil))
  375. c = newconn(anotherID)
  376. if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil {
  377. t.Error("unexpected error for trusted conn @posthandshake:", err)
  378. }
  379. if !c.is(trustedConn) {
  380. t.Error("Server did not set trusted flag")
  381. }
  382. }
  383. func TestServerPeerLimits(t *testing.T) {
  384. srvkey := newkey()
  385. clientkey := newkey()
  386. clientnode := enode.NewV4(&clientkey.PublicKey, nil, 0, 0)
  387. var tp = &setupTransport{
  388. pubkey: &clientkey.PublicKey,
  389. phs: protoHandshake{
  390. ID: crypto.FromECDSAPub(&clientkey.PublicKey)[1:],
  391. // Force "DiscUselessPeer" due to unmatching caps
  392. // Caps: []Cap{discard.cap()},
  393. },
  394. }
  395. srv := &Server{
  396. Config: Config{
  397. PrivateKey: srvkey,
  398. MaxPeers: 0,
  399. NoDial: true,
  400. NoDiscovery: true,
  401. Protocols: []Protocol{discard},
  402. },
  403. newTransport: func(fd net.Conn) transport { return tp },
  404. log: log.New(),
  405. }
  406. if err := srv.Start(); err != nil {
  407. t.Fatalf("couldn't start server: %v", err)
  408. }
  409. defer srv.Stop()
  410. // Check that server is full (MaxPeers=0)
  411. flags := dynDialedConn
  412. dialDest := clientnode
  413. conn, _ := net.Pipe()
  414. srv.SetupConn(conn, flags, dialDest)
  415. if tp.closeErr != DiscTooManyPeers {
  416. t.Errorf("unexpected close error: %q", tp.closeErr)
  417. }
  418. conn.Close()
  419. srv.AddTrustedPeer(clientnode)
  420. // Check that server allows a trusted peer despite being full.
  421. conn, _ = net.Pipe()
  422. srv.SetupConn(conn, flags, dialDest)
  423. if tp.closeErr == DiscTooManyPeers {
  424. t.Errorf("failed to bypass MaxPeers with trusted node: %q", tp.closeErr)
  425. }
  426. if tp.closeErr != DiscUselessPeer {
  427. t.Errorf("unexpected close error: %q", tp.closeErr)
  428. }
  429. conn.Close()
  430. srv.RemoveTrustedPeer(clientnode)
  431. // Check that server is full again.
  432. conn, _ = net.Pipe()
  433. srv.SetupConn(conn, flags, dialDest)
  434. if tp.closeErr != DiscTooManyPeers {
  435. t.Errorf("unexpected close error: %q", tp.closeErr)
  436. }
  437. conn.Close()
  438. }
  439. func TestServerSetupConn(t *testing.T) {
  440. var (
  441. clientkey, srvkey = newkey(), newkey()
  442. clientpub = &clientkey.PublicKey
  443. srvpub = &srvkey.PublicKey
  444. )
  445. tests := []struct {
  446. dontstart bool
  447. tt *setupTransport
  448. flags connFlag
  449. dialDest *enode.Node
  450. wantCloseErr error
  451. wantCalls string
  452. }{
  453. {
  454. dontstart: true,
  455. tt: &setupTransport{pubkey: clientpub},
  456. wantCalls: "close,",
  457. wantCloseErr: errServerStopped,
  458. },
  459. {
  460. tt: &setupTransport{pubkey: clientpub, encHandshakeErr: errors.New("read error")},
  461. flags: inboundConn,
  462. wantCalls: "doEncHandshake,close,",
  463. wantCloseErr: errors.New("read error"),
  464. },
  465. {
  466. tt: &setupTransport{pubkey: clientpub},
  467. dialDest: enode.NewV4(&newkey().PublicKey, nil, 0, 0),
  468. flags: dynDialedConn,
  469. wantCalls: "doEncHandshake,close,",
  470. wantCloseErr: DiscUnexpectedIdentity,
  471. },
  472. {
  473. tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{ID: randomID().Bytes()}},
  474. dialDest: enode.NewV4(clientpub, nil, 0, 0),
  475. flags: dynDialedConn,
  476. wantCalls: "doEncHandshake,doProtoHandshake,close,",
  477. wantCloseErr: DiscUnexpectedIdentity,
  478. },
  479. {
  480. tt: &setupTransport{pubkey: clientpub, protoHandshakeErr: errors.New("foo")},
  481. dialDest: enode.NewV4(clientpub, nil, 0, 0),
  482. flags: dynDialedConn,
  483. wantCalls: "doEncHandshake,doProtoHandshake,close,",
  484. wantCloseErr: errors.New("foo"),
  485. },
  486. {
  487. tt: &setupTransport{pubkey: srvpub, phs: protoHandshake{ID: crypto.FromECDSAPub(srvpub)[1:]}},
  488. flags: inboundConn,
  489. wantCalls: "doEncHandshake,close,",
  490. wantCloseErr: DiscSelf,
  491. },
  492. {
  493. tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{ID: crypto.FromECDSAPub(clientpub)[1:]}},
  494. flags: inboundConn,
  495. wantCalls: "doEncHandshake,doProtoHandshake,close,",
  496. wantCloseErr: DiscUselessPeer,
  497. },
  498. }
  499. for i, test := range tests {
  500. t.Run(test.wantCalls, func(t *testing.T) {
  501. cfg := Config{
  502. PrivateKey: srvkey,
  503. MaxPeers: 10,
  504. NoDial: true,
  505. NoDiscovery: true,
  506. Protocols: []Protocol{discard},
  507. Logger: testlog.Logger(t, log.LvlTrace),
  508. }
  509. srv := &Server{
  510. Config: cfg,
  511. newTransport: func(fd net.Conn) transport { return test.tt },
  512. log: cfg.Logger,
  513. }
  514. if !test.dontstart {
  515. if err := srv.Start(); err != nil {
  516. t.Fatalf("couldn't start server: %v", err)
  517. }
  518. defer srv.Stop()
  519. }
  520. p1, _ := net.Pipe()
  521. srv.SetupConn(p1, test.flags, test.dialDest)
  522. if !reflect.DeepEqual(test.tt.closeErr, test.wantCloseErr) {
  523. t.Errorf("test %d: close error mismatch: got %q, want %q", i, test.tt.closeErr, test.wantCloseErr)
  524. }
  525. if test.tt.calls != test.wantCalls {
  526. t.Errorf("test %d: calls mismatch: got %q, want %q", i, test.tt.calls, test.wantCalls)
  527. }
  528. })
  529. }
  530. }
  531. type setupTransport struct {
  532. pubkey *ecdsa.PublicKey
  533. encHandshakeErr error
  534. phs protoHandshake
  535. protoHandshakeErr error
  536. calls string
  537. closeErr error
  538. }
  539. func (c *setupTransport) doEncHandshake(prv *ecdsa.PrivateKey, dialDest *ecdsa.PublicKey) (*ecdsa.PublicKey, error) {
  540. c.calls += "doEncHandshake,"
  541. return c.pubkey, c.encHandshakeErr
  542. }
  543. func (c *setupTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) {
  544. c.calls += "doProtoHandshake,"
  545. if c.protoHandshakeErr != nil {
  546. return nil, c.protoHandshakeErr
  547. }
  548. return &c.phs, nil
  549. }
  550. func (c *setupTransport) close(err error) {
  551. c.calls += "close,"
  552. c.closeErr = err
  553. }
  554. // setupConn shouldn't write to/read from the connection.
  555. func (c *setupTransport) WriteMsg(Msg) error {
  556. panic("WriteMsg called on setupTransport")
  557. }
  558. func (c *setupTransport) ReadMsg() (Msg, error) {
  559. panic("ReadMsg called on setupTransport")
  560. }
  561. func newkey() *ecdsa.PrivateKey {
  562. key, err := crypto.GenerateKey()
  563. if err != nil {
  564. panic("couldn't generate key: " + err.Error())
  565. }
  566. return key
  567. }
  568. func randomID() (id enode.ID) {
  569. for i := range id {
  570. id[i] = byte(rand.Intn(255))
  571. }
  572. return id
  573. }
  574. // This test checks that inbound connections are throttled by IP.
  575. func TestServerInboundThrottle(t *testing.T) {
  576. const timeout = 5 * time.Second
  577. newTransportCalled := make(chan struct{})
  578. srv := &Server{
  579. Config: Config{
  580. PrivateKey: newkey(),
  581. ListenAddr: "127.0.0.1:0",
  582. MaxPeers: 10,
  583. NoDial: true,
  584. NoDiscovery: true,
  585. Protocols: []Protocol{discard},
  586. Logger: testlog.Logger(t, log.LvlTrace),
  587. },
  588. newTransport: func(fd net.Conn) transport {
  589. newTransportCalled <- struct{}{}
  590. return newRLPX(fd)
  591. },
  592. listenFunc: func(network, laddr string) (net.Listener, error) {
  593. fakeAddr := &net.TCPAddr{IP: net.IP{95, 33, 21, 2}, Port: 4444}
  594. return listenFakeAddr(network, laddr, fakeAddr)
  595. },
  596. }
  597. if err := srv.Start(); err != nil {
  598. t.Fatal("can't start: ", err)
  599. }
  600. defer srv.Stop()
  601. // Dial the test server.
  602. conn, err := net.DialTimeout("tcp", srv.ListenAddr, timeout)
  603. if err != nil {
  604. t.Fatalf("could not dial: %v", err)
  605. }
  606. select {
  607. case <-newTransportCalled:
  608. // OK
  609. case <-time.After(timeout):
  610. t.Error("newTransport not called")
  611. }
  612. conn.Close()
  613. // Dial again. This time the server should close the connection immediately.
  614. connClosed := make(chan struct{})
  615. conn, err = net.DialTimeout("tcp", srv.ListenAddr, timeout)
  616. if err != nil {
  617. t.Fatalf("could not dial: %v", err)
  618. }
  619. defer conn.Close()
  620. go func() {
  621. conn.SetDeadline(time.Now().Add(timeout))
  622. buf := make([]byte, 10)
  623. if n, err := conn.Read(buf); err != io.EOF || n != 0 {
  624. t.Errorf("expected io.EOF and n == 0, got error %q and n == %d", err, n)
  625. }
  626. connClosed <- struct{}{}
  627. }()
  628. select {
  629. case <-connClosed:
  630. // OK
  631. case <-newTransportCalled:
  632. t.Error("newTransport called for second attempt")
  633. case <-time.After(timeout):
  634. t.Error("connection not closed within timeout")
  635. }
  636. }
  637. func listenFakeAddr(network, laddr string, remoteAddr net.Addr) (net.Listener, error) {
  638. l, err := net.Listen(network, laddr)
  639. if err == nil {
  640. l = &fakeAddrListener{l, remoteAddr}
  641. }
  642. return l, err
  643. }
  644. // fakeAddrListener is a listener that creates connections with a mocked remote address.
  645. type fakeAddrListener struct {
  646. net.Listener
  647. remoteAddr net.Addr
  648. }
  649. type fakeAddrConn struct {
  650. net.Conn
  651. remoteAddr net.Addr
  652. }
  653. func (l *fakeAddrListener) Accept() (net.Conn, error) {
  654. c, err := l.Listener.Accept()
  655. if err != nil {
  656. return nil, err
  657. }
  658. return &fakeAddrConn{c, l.remoteAddr}, nil
  659. }
  660. func (c *fakeAddrConn) RemoteAddr() net.Addr {
  661. return c.remoteAddr
  662. }