derp_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package derp_test
  4. import (
  5. "bufio"
  6. "bytes"
  7. "context"
  8. "encoding/json"
  9. "errors"
  10. "expvar"
  11. "fmt"
  12. "io"
  13. "net"
  14. "strings"
  15. "sync"
  16. "testing"
  17. "time"
  18. "tailscale.com/derp"
  19. "tailscale.com/derp/derpserver"
  20. "tailscale.com/disco"
  21. "tailscale.com/metrics"
  22. "tailscale.com/net/memnet"
  23. "tailscale.com/types/key"
  24. "tailscale.com/types/logger"
  25. "tailscale.com/util/must"
  26. )
  27. type (
  28. ClientInfo = derp.ClientInfo
  29. Conn = derp.Conn
  30. Client = derp.Client
  31. )
  32. func TestClientInfoUnmarshal(t *testing.T) {
  33. for i, in := range map[string]struct {
  34. json string
  35. want *ClientInfo
  36. wantErr string
  37. }{
  38. "empty": {
  39. json: `{}`,
  40. want: &ClientInfo{},
  41. },
  42. "valid": {
  43. json: `{"Version":5,"MeshKey":"6d529e9d4ef632d22d4a4214cb49da8f1ba1b72697061fb24e312984c35ec8d8"}`,
  44. want: &ClientInfo{MeshKey: must.Get(key.ParseDERPMesh("6d529e9d4ef632d22d4a4214cb49da8f1ba1b72697061fb24e312984c35ec8d8")), Version: 5},
  45. },
  46. "validLowerMeshKey": {
  47. json: `{"version":5,"meshKey":"6d529e9d4ef632d22d4a4214cb49da8f1ba1b72697061fb24e312984c35ec8d8"}`,
  48. want: &ClientInfo{MeshKey: must.Get(key.ParseDERPMesh("6d529e9d4ef632d22d4a4214cb49da8f1ba1b72697061fb24e312984c35ec8d8")), Version: 5},
  49. },
  50. "invalidMeshKeyToShort": {
  51. json: `{"version":5,"meshKey":"abcdefg"}`,
  52. wantErr: "invalid mesh key",
  53. },
  54. "invalidMeshKeyToLong": {
  55. json: `{"version":5,"meshKey":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}`,
  56. wantErr: "invalid mesh key",
  57. },
  58. } {
  59. t.Run(i, func(t *testing.T) {
  60. t.Parallel()
  61. var got ClientInfo
  62. err := json.Unmarshal([]byte(in.json), &got)
  63. if in.wantErr != "" {
  64. if err == nil || !strings.Contains(err.Error(), in.wantErr) {
  65. t.Errorf("Unmarshal(%q) = %v, want error containing %q", in.json, err, in.wantErr)
  66. }
  67. return
  68. }
  69. if err != nil {
  70. t.Fatalf("Unmarshal(%q) = %v, want no error", in.json, err)
  71. }
  72. if !got.Equal(in.want) {
  73. t.Errorf("Unmarshal(%q) = %+v, want %+v", in.json, got, in.want)
  74. }
  75. })
  76. }
  77. }
  78. func TestSendRecv(t *testing.T) {
  79. serverPrivateKey := key.NewNode()
  80. s := derpserver.New(serverPrivateKey, t.Logf)
  81. defer s.Close()
  82. const numClients = 3
  83. var clientPrivateKeys []key.NodePrivate
  84. var clientKeys []key.NodePublic
  85. for range numClients {
  86. priv := key.NewNode()
  87. clientPrivateKeys = append(clientPrivateKeys, priv)
  88. clientKeys = append(clientKeys, priv.Public())
  89. }
  90. ln, err := net.Listen("tcp", "127.0.0.1:0")
  91. if err != nil {
  92. t.Fatal(err)
  93. }
  94. defer ln.Close()
  95. var clients []*Client
  96. var connsOut []Conn
  97. var recvChs []chan []byte
  98. errCh := make(chan error, 3)
  99. for i := range numClients {
  100. t.Logf("Connecting client %d ...", i)
  101. cout, err := net.Dial("tcp", ln.Addr().String())
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. defer cout.Close()
  106. connsOut = append(connsOut, cout)
  107. cin, err := ln.Accept()
  108. if err != nil {
  109. t.Fatal(err)
  110. }
  111. defer cin.Close()
  112. ctx, cancel := context.WithCancel(context.Background())
  113. defer cancel()
  114. brwServer := bufio.NewReadWriter(bufio.NewReader(cin), bufio.NewWriter(cin))
  115. go s.Accept(ctx, cin, brwServer, fmt.Sprintf("[abc::def]:%v", i))
  116. key := clientPrivateKeys[i]
  117. brw := bufio.NewReadWriter(bufio.NewReader(cout), bufio.NewWriter(cout))
  118. c, err := derp.NewClient(key, cout, brw, t.Logf)
  119. if err != nil {
  120. t.Fatalf("client %d: %v", i, err)
  121. }
  122. waitConnect(t, c)
  123. clients = append(clients, c)
  124. recvChs = append(recvChs, make(chan []byte))
  125. t.Logf("Connected client %d.", i)
  126. }
  127. var peerGoneCountDisconnected expvar.Int
  128. var peerGoneCountNotHere expvar.Int
  129. t.Logf("Starting read loops")
  130. for i := range numClients {
  131. go func(i int) {
  132. for {
  133. m, err := clients[i].Recv()
  134. if err != nil {
  135. errCh <- err
  136. return
  137. }
  138. switch m := m.(type) {
  139. default:
  140. t.Errorf("unexpected message type %T", m)
  141. continue
  142. case derp.PeerGoneMessage:
  143. switch m.Reason {
  144. case derp.PeerGoneReasonDisconnected:
  145. peerGoneCountDisconnected.Add(1)
  146. case derp.PeerGoneReasonNotHere:
  147. peerGoneCountNotHere.Add(1)
  148. default:
  149. t.Errorf("unexpected PeerGone reason %v", m.Reason)
  150. }
  151. case derp.ReceivedPacket:
  152. if m.Source.IsZero() {
  153. t.Errorf("zero Source address in ReceivedPacket")
  154. }
  155. recvChs[i] <- bytes.Clone(m.Data)
  156. }
  157. }
  158. }(i)
  159. }
  160. recv := func(i int, want string) {
  161. t.Helper()
  162. select {
  163. case b := <-recvChs[i]:
  164. if got := string(b); got != want {
  165. t.Errorf("client1.Recv=%q, want %q", got, want)
  166. }
  167. case <-time.After(5 * time.Second):
  168. t.Errorf("client%d.Recv, got nothing, want %q", i, want)
  169. }
  170. }
  171. recvNothing := func(i int) {
  172. t.Helper()
  173. select {
  174. case b := <-recvChs[0]:
  175. t.Errorf("client%d.Recv=%q, want nothing", i, string(b))
  176. default:
  177. }
  178. }
  179. serverMetrics := s.ExpVar().(*metrics.Set)
  180. wantActive := func(total, home int64) {
  181. t.Helper()
  182. dl := time.Now().Add(5 * time.Second)
  183. var gotTotal, gotHome int64
  184. for time.Now().Before(dl) {
  185. gotTotal = serverMetrics.Get("gauge_current_connections").(*expvar.Int).Value()
  186. gotHome = serverMetrics.Get("gauge_current_home_connections").(*expvar.Int).Value()
  187. if gotTotal == total && gotHome == home {
  188. return
  189. }
  190. time.Sleep(10 * time.Millisecond)
  191. }
  192. t.Errorf("total/home=%v/%v; want %v/%v", gotTotal, gotHome, total, home)
  193. }
  194. wantClosedPeers := func(want int64) {
  195. t.Helper()
  196. var got int64
  197. dl := time.Now().Add(5 * time.Second)
  198. for time.Now().Before(dl) {
  199. if got = peerGoneCountDisconnected.Value(); got == want {
  200. return
  201. }
  202. }
  203. t.Errorf("peer gone count = %v; want %v", got, want)
  204. }
  205. wantUnknownPeers := func(want int64) {
  206. t.Helper()
  207. var got int64
  208. dl := time.Now().Add(5 * time.Second)
  209. for time.Now().Before(dl) {
  210. if got = peerGoneCountNotHere.Value(); got == want {
  211. return
  212. }
  213. }
  214. t.Errorf("peer gone count = %v; want %v", got, want)
  215. }
  216. msg1 := []byte("hello 0->1\n")
  217. if err := clients[0].Send(clientKeys[1], msg1); err != nil {
  218. t.Fatal(err)
  219. }
  220. recv(1, string(msg1))
  221. recvNothing(0)
  222. recvNothing(2)
  223. msg2 := []byte("hello 1->2\n")
  224. if err := clients[1].Send(clientKeys[2], msg2); err != nil {
  225. t.Fatal(err)
  226. }
  227. recv(2, string(msg2))
  228. recvNothing(0)
  229. recvNothing(1)
  230. // Send messages to a non-existent node
  231. neKey := key.NewNode().Public()
  232. msg4 := []byte("not a CallMeMaybe->unknown destination\n")
  233. if err := clients[1].Send(neKey, msg4); err != nil {
  234. t.Fatal(err)
  235. }
  236. wantUnknownPeers(0)
  237. callMe := neKey.AppendTo([]byte(disco.Magic))
  238. callMeHeader := make([]byte, disco.NonceLen)
  239. callMe = append(callMe, callMeHeader...)
  240. if err := clients[1].Send(neKey, callMe); err != nil {
  241. t.Fatal(err)
  242. }
  243. wantUnknownPeers(1)
  244. // PeerGoneNotHere is rate-limited to 3 times a second
  245. for range 5 {
  246. if err := clients[1].Send(neKey, callMe); err != nil {
  247. t.Fatal(err)
  248. }
  249. }
  250. wantUnknownPeers(3)
  251. wantActive(3, 0)
  252. clients[0].NotePreferred(true)
  253. wantActive(3, 1)
  254. clients[0].NotePreferred(true)
  255. wantActive(3, 1)
  256. clients[0].NotePreferred(false)
  257. wantActive(3, 0)
  258. clients[0].NotePreferred(false)
  259. wantActive(3, 0)
  260. clients[1].NotePreferred(true)
  261. wantActive(3, 1)
  262. connsOut[1].Close()
  263. wantActive(2, 0)
  264. wantClosedPeers(1)
  265. clients[2].NotePreferred(true)
  266. wantActive(2, 1)
  267. clients[2].NotePreferred(false)
  268. wantActive(2, 0)
  269. connsOut[2].Close()
  270. wantActive(1, 0)
  271. wantClosedPeers(1)
  272. t.Logf("passed")
  273. s.Close()
  274. }
  275. func TestSendFreeze(t *testing.T) {
  276. serverPrivateKey := key.NewNode()
  277. s := derpserver.New(serverPrivateKey, t.Logf)
  278. defer s.Close()
  279. s.WriteTimeout = 100 * time.Millisecond
  280. // We send two streams of messages:
  281. //
  282. // alice --> bob
  283. // alice --> cathy
  284. //
  285. // Then cathy stops processing messages.
  286. // That should not interfere with alice talking to bob.
  287. newClient := func(ctx context.Context, name string, k key.NodePrivate) (c *Client, clientConn memnet.Conn) {
  288. t.Helper()
  289. c1, c2 := memnet.NewConn(name, 1024)
  290. go s.Accept(ctx, c1, bufio.NewReadWriter(bufio.NewReader(c1), bufio.NewWriter(c1)), name)
  291. brw := bufio.NewReadWriter(bufio.NewReader(c2), bufio.NewWriter(c2))
  292. c, err := derp.NewClient(k, c2, brw, t.Logf)
  293. if err != nil {
  294. t.Fatal(err)
  295. }
  296. waitConnect(t, c)
  297. return c, c2
  298. }
  299. ctx, clientCtxCancel := context.WithCancel(context.Background())
  300. defer clientCtxCancel()
  301. aliceKey := key.NewNode()
  302. aliceClient, aliceConn := newClient(ctx, "alice", aliceKey)
  303. bobKey := key.NewNode()
  304. bobClient, bobConn := newClient(ctx, "bob", bobKey)
  305. cathyKey := key.NewNode()
  306. cathyClient, cathyConn := newClient(ctx, "cathy", cathyKey)
  307. var (
  308. aliceCh = make(chan struct{}, 32)
  309. bobCh = make(chan struct{}, 32)
  310. cathyCh = make(chan struct{}, 32)
  311. )
  312. chs := func(name string) chan struct{} {
  313. switch name {
  314. case "alice":
  315. return aliceCh
  316. case "bob":
  317. return bobCh
  318. case "cathy":
  319. return cathyCh
  320. default:
  321. panic("unknown ch: " + name)
  322. }
  323. }
  324. errCh := make(chan error, 4)
  325. recv := func(name string, client *Client) {
  326. ch := chs(name)
  327. for {
  328. m, err := client.Recv()
  329. if err != nil {
  330. errCh <- fmt.Errorf("%s: %w", name, err)
  331. return
  332. }
  333. switch m := m.(type) {
  334. default:
  335. errCh <- fmt.Errorf("%s: unexpected message type %T", name, m)
  336. return
  337. case derp.ReceivedPacket:
  338. if m.Source.IsZero() {
  339. errCh <- fmt.Errorf("%s: zero Source address in ReceivedPacket", name)
  340. return
  341. }
  342. select {
  343. case ch <- struct{}{}:
  344. default:
  345. }
  346. }
  347. }
  348. }
  349. go recv("alice", aliceClient)
  350. go recv("bob", bobClient)
  351. go recv("cathy", cathyClient)
  352. var cancel func()
  353. go func() {
  354. t := time.NewTicker(2 * time.Millisecond)
  355. defer t.Stop()
  356. var ctx context.Context
  357. ctx, cancel = context.WithCancel(context.Background())
  358. for {
  359. select {
  360. case <-t.C:
  361. case <-ctx.Done():
  362. errCh <- nil
  363. return
  364. }
  365. msg1 := []byte("hello alice->bob\n")
  366. if err := aliceClient.Send(bobKey.Public(), msg1); err != nil {
  367. errCh <- fmt.Errorf("alice send to bob: %w", err)
  368. return
  369. }
  370. msg2 := []byte("hello alice->cathy\n")
  371. // TODO: an error is expected here.
  372. // We ignore it, maybe we should log it somehow?
  373. aliceClient.Send(cathyKey.Public(), msg2)
  374. }
  375. }()
  376. drainAny := func(ch chan struct{}) {
  377. // We are draining potentially infinite sources,
  378. // so place some reasonable upper limit.
  379. //
  380. // The important thing here is to make sure that
  381. // if any tokens remain in the channel, they
  382. // must have been generated after drainAny was
  383. // called.
  384. for range cap(ch) {
  385. select {
  386. case <-ch:
  387. default:
  388. return
  389. }
  390. }
  391. }
  392. drain := func(t *testing.T, name string) bool {
  393. t.Helper()
  394. timer := time.NewTimer(1 * time.Second)
  395. defer timer.Stop()
  396. // Ensure ch has at least one element.
  397. ch := chs(name)
  398. select {
  399. case <-ch:
  400. case <-timer.C:
  401. t.Errorf("no packet received by %s", name)
  402. return false
  403. }
  404. // Drain remaining.
  405. drainAny(ch)
  406. return true
  407. }
  408. isEmpty := func(t *testing.T, name string) {
  409. t.Helper()
  410. select {
  411. case <-chs(name):
  412. t.Errorf("packet received by %s, want none", name)
  413. default:
  414. }
  415. }
  416. t.Run("initial send", func(t *testing.T) {
  417. drain(t, "bob")
  418. drain(t, "cathy")
  419. isEmpty(t, "alice")
  420. })
  421. t.Run("block cathy", func(t *testing.T) {
  422. // Block cathy. Now the cathyConn buffer will fill up quickly,
  423. // and the derp server will back up.
  424. cathyConn.SetReadBlock(true)
  425. time.Sleep(2 * s.WriteTimeout)
  426. drain(t, "bob")
  427. drainAny(chs("cathy"))
  428. isEmpty(t, "alice")
  429. // Now wait a little longer, and ensure packets still flow to bob
  430. if !drain(t, "bob") {
  431. t.Errorf("connection alice->bob frozen by alice->cathy")
  432. }
  433. })
  434. // Cleanup, make sure we process all errors.
  435. t.Logf("TEST COMPLETE, cancelling sender")
  436. cancel()
  437. t.Logf("closing connections")
  438. // Close bob before alice.
  439. // Starting with alice can cause a PeerGoneMessage to reach
  440. // bob before bob is closed, causing a test flake (issue 2668).
  441. bobConn.Close()
  442. aliceConn.Close()
  443. cathyConn.Close()
  444. for range cap(errCh) {
  445. err := <-errCh
  446. if err != nil {
  447. if errors.Is(err, io.EOF) || errors.Is(err, net.ErrClosed) {
  448. continue
  449. }
  450. t.Error(err)
  451. }
  452. }
  453. }
  454. type testServer struct {
  455. s *derpserver.Server
  456. ln net.Listener
  457. logf logger.Logf
  458. mu sync.Mutex
  459. pubName map[key.NodePublic]string
  460. clients map[*testClient]bool
  461. }
  462. func (ts *testServer) addTestClient(c *testClient) {
  463. ts.mu.Lock()
  464. defer ts.mu.Unlock()
  465. ts.clients[c] = true
  466. }
  467. func (ts *testServer) addKeyName(k key.NodePublic, name string) {
  468. ts.mu.Lock()
  469. defer ts.mu.Unlock()
  470. ts.pubName[k] = name
  471. ts.logf("test adding named key %q for %x", name, k)
  472. }
  473. func (ts *testServer) keyName(k key.NodePublic) string {
  474. ts.mu.Lock()
  475. defer ts.mu.Unlock()
  476. if name, ok := ts.pubName[k]; ok {
  477. return name
  478. }
  479. return k.ShortString()
  480. }
  481. func (ts *testServer) close(t *testing.T) error {
  482. ts.ln.Close()
  483. ts.s.Close()
  484. for c := range ts.clients {
  485. c.close(t)
  486. }
  487. return nil
  488. }
  489. const testMeshKey = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
  490. func newTestServer(t *testing.T, ctx context.Context) *testServer {
  491. t.Helper()
  492. logf := logger.WithPrefix(t.Logf, "derp-server: ")
  493. s := derpserver.New(key.NewNode(), logf)
  494. s.SetMeshKey(testMeshKey)
  495. ln, err := net.Listen("tcp", "127.0.0.1:0")
  496. if err != nil {
  497. t.Fatal(err)
  498. }
  499. go func() {
  500. i := 0
  501. for {
  502. i++
  503. c, err := ln.Accept()
  504. if err != nil {
  505. return
  506. }
  507. // TODO: register c in ts so Close also closes it?
  508. go func(i int) {
  509. brwServer := bufio.NewReadWriter(bufio.NewReader(c), bufio.NewWriter(c))
  510. go s.Accept(ctx, c, brwServer, c.RemoteAddr().String())
  511. }(i)
  512. }
  513. }()
  514. return &testServer{
  515. s: s,
  516. ln: ln,
  517. logf: logf,
  518. clients: map[*testClient]bool{},
  519. pubName: map[key.NodePublic]string{},
  520. }
  521. }
  522. type testClient struct {
  523. name string
  524. c *Client
  525. nc net.Conn
  526. pub key.NodePublic
  527. ts *testServer
  528. closed bool
  529. }
  530. func newTestClient(t *testing.T, ts *testServer, name string, newClient func(net.Conn, key.NodePrivate, logger.Logf) (*Client, error)) *testClient {
  531. t.Helper()
  532. nc, err := net.Dial("tcp", ts.ln.Addr().String())
  533. if err != nil {
  534. t.Fatal(err)
  535. }
  536. k := key.NewNode()
  537. ts.addKeyName(k.Public(), name)
  538. c, err := newClient(nc, k, logger.WithPrefix(t.Logf, "client-"+name+": "))
  539. if err != nil {
  540. t.Fatal(err)
  541. }
  542. tc := &testClient{
  543. name: name,
  544. nc: nc,
  545. c: c,
  546. ts: ts,
  547. pub: k.Public(),
  548. }
  549. ts.addTestClient(tc)
  550. return tc
  551. }
  552. func newRegularClient(t *testing.T, ts *testServer, name string) *testClient {
  553. return newTestClient(t, ts, name, func(nc net.Conn, priv key.NodePrivate, logf logger.Logf) (*Client, error) {
  554. brw := bufio.NewReadWriter(bufio.NewReader(nc), bufio.NewWriter(nc))
  555. c, err := derp.NewClient(priv, nc, brw, logf)
  556. if err != nil {
  557. return nil, err
  558. }
  559. waitConnect(t, c)
  560. return c, nil
  561. })
  562. }
  563. func newTestWatcher(t *testing.T, ts *testServer, name string) *testClient {
  564. return newTestClient(t, ts, name, func(nc net.Conn, priv key.NodePrivate, logf logger.Logf) (*Client, error) {
  565. mk, err := key.ParseDERPMesh(testMeshKey)
  566. if err != nil {
  567. return nil, err
  568. }
  569. brw := bufio.NewReadWriter(bufio.NewReader(nc), bufio.NewWriter(nc))
  570. c, err := derp.NewClient(priv, nc, brw, logf, derp.MeshKey(mk))
  571. if err != nil {
  572. return nil, err
  573. }
  574. waitConnect(t, c)
  575. if err := c.WatchConnectionChanges(); err != nil {
  576. return nil, err
  577. }
  578. return c, nil
  579. })
  580. }
  581. func (tc *testClient) wantPresent(t *testing.T, peers ...key.NodePublic) {
  582. t.Helper()
  583. want := map[key.NodePublic]bool{}
  584. for _, k := range peers {
  585. want[k] = true
  586. }
  587. for {
  588. m, err := tc.c.RecvTimeoutForTest(time.Second)
  589. if err != nil {
  590. t.Fatal(err)
  591. }
  592. switch m := m.(type) {
  593. case derp.PeerPresentMessage:
  594. got := m.Key
  595. if !want[got] {
  596. t.Fatalf("got peer present for %v; want present for %v", tc.ts.keyName(got), logger.ArgWriter(func(bw *bufio.Writer) {
  597. for _, pub := range peers {
  598. fmt.Fprintf(bw, "%s ", tc.ts.keyName(pub))
  599. }
  600. }))
  601. }
  602. t.Logf("got present with IP %v, flags=%v", m.IPPort, m.Flags)
  603. switch m.Flags {
  604. case derp.PeerPresentIsMeshPeer, derp.PeerPresentIsRegular:
  605. // Okay
  606. default:
  607. t.Errorf("unexpected PeerPresentIsMeshPeer flags %v", m.Flags)
  608. }
  609. delete(want, got)
  610. if len(want) == 0 {
  611. return
  612. }
  613. default:
  614. t.Fatalf("unexpected message type %T", m)
  615. }
  616. }
  617. }
  618. func (tc *testClient) wantGone(t *testing.T, peer key.NodePublic) {
  619. t.Helper()
  620. m, err := tc.c.RecvTimeoutForTest(time.Second)
  621. if err != nil {
  622. t.Fatal(err)
  623. }
  624. switch m := m.(type) {
  625. case derp.PeerGoneMessage:
  626. got := key.NodePublic(m.Peer)
  627. if peer != got {
  628. t.Errorf("got gone message for %v; want gone for %v", tc.ts.keyName(got), tc.ts.keyName(peer))
  629. }
  630. reason := m.Reason
  631. if reason != derp.PeerGoneReasonDisconnected {
  632. t.Errorf("got gone message for reason %v; wanted %v", reason, derp.PeerGoneReasonDisconnected)
  633. }
  634. default:
  635. t.Fatalf("unexpected message type %T", m)
  636. }
  637. }
  638. func (c *testClient) close(t *testing.T) {
  639. t.Helper()
  640. if c.closed {
  641. return
  642. }
  643. c.closed = true
  644. t.Logf("closing client %q (%x)", c.name, c.pub)
  645. c.nc.Close()
  646. }
  647. // TestWatch tests the connection watcher mechanism used by regional
  648. // DERP nodes to mesh up with each other.
  649. func TestWatch(t *testing.T) {
  650. ctx, cancel := context.WithCancel(context.Background())
  651. defer cancel()
  652. ts := newTestServer(t, ctx)
  653. defer ts.close(t)
  654. w1 := newTestWatcher(t, ts, "w1")
  655. w1.wantPresent(t, w1.pub)
  656. c1 := newRegularClient(t, ts, "c1")
  657. w1.wantPresent(t, c1.pub)
  658. c2 := newRegularClient(t, ts, "c2")
  659. w1.wantPresent(t, c2.pub)
  660. w2 := newTestWatcher(t, ts, "w2")
  661. w1.wantPresent(t, w2.pub)
  662. w2.wantPresent(t, w1.pub, w2.pub, c1.pub, c2.pub)
  663. c3 := newRegularClient(t, ts, "c3")
  664. w1.wantPresent(t, c3.pub)
  665. w2.wantPresent(t, c3.pub)
  666. c2.close(t)
  667. w1.wantGone(t, c2.pub)
  668. w2.wantGone(t, c2.pub)
  669. w3 := newTestWatcher(t, ts, "w3")
  670. w1.wantPresent(t, w3.pub)
  671. w2.wantPresent(t, w3.pub)
  672. w3.wantPresent(t, c1.pub, c3.pub, w1.pub, w2.pub, w3.pub)
  673. c1.close(t)
  674. w1.wantGone(t, c1.pub)
  675. w2.wantGone(t, c1.pub)
  676. w3.wantGone(t, c1.pub)
  677. }
  678. func waitConnect(t testing.TB, c *Client) {
  679. t.Helper()
  680. if m, err := c.Recv(); err != nil {
  681. t.Fatalf("client first Recv: %v", err)
  682. } else if v, ok := m.(derp.ServerInfoMessage); !ok {
  683. t.Fatalf("client first Recv was unexpected type %T", v)
  684. }
  685. }
  686. func TestServerRepliesToPing(t *testing.T) {
  687. ctx, cancel := context.WithCancel(context.Background())
  688. defer cancel()
  689. ts := newTestServer(t, ctx)
  690. defer ts.close(t)
  691. tc := newRegularClient(t, ts, "alice")
  692. data := [8]byte{1, 2, 3, 4, 5, 6, 7, 42}
  693. if err := tc.c.SendPing(data); err != nil {
  694. t.Fatal(err)
  695. }
  696. for {
  697. m, err := tc.c.RecvTimeoutForTest(time.Second)
  698. if err != nil {
  699. t.Fatal(err)
  700. }
  701. switch m := m.(type) {
  702. case derp.PongMessage:
  703. if ([8]byte(m)) != data {
  704. t.Fatalf("got pong %2x; want %2x", [8]byte(m), data)
  705. }
  706. return
  707. }
  708. }
  709. }