stunserver_test.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package stunserver
  4. import (
  5. "context"
  6. "net"
  7. "sync"
  8. "testing"
  9. "time"
  10. "tailscale.com/net/stun"
  11. "tailscale.com/util/must"
  12. )
  13. func TestSTUNServer(t *testing.T) {
  14. ctx, cancel := context.WithCancel(context.Background())
  15. defer cancel()
  16. s := New(ctx)
  17. must.Do(s.Listen("localhost:0"))
  18. var w sync.WaitGroup
  19. w.Add(1)
  20. var serveErr error
  21. go func() {
  22. defer w.Done()
  23. serveErr = s.Serve()
  24. }()
  25. c := must.Get(net.DialUDP("udp", nil, s.LocalAddr().(*net.UDPAddr)))
  26. defer c.Close()
  27. c.SetDeadline(time.Now().Add(5 * time.Second))
  28. txid := stun.NewTxID()
  29. _, err := c.Write(stun.Request(txid))
  30. if err != nil {
  31. t.Fatalf("failed to write STUN request: %v", err)
  32. }
  33. var buf [64 << 10]byte
  34. n, err := c.Read(buf[:])
  35. if err != nil {
  36. t.Fatalf("failed to read STUN response: %v", err)
  37. }
  38. if !stun.Is(buf[:n]) {
  39. t.Fatalf("response is not STUN")
  40. }
  41. tid, _, err := stun.ParseResponse(buf[:n])
  42. if err != nil {
  43. t.Fatalf("failed to parse STUN response: %v", err)
  44. }
  45. if tid != txid {
  46. t.Fatalf("STUN response has wrong transaction ID; got %d, want %d", tid, txid)
  47. }
  48. cancel()
  49. w.Wait()
  50. if serveErr != nil {
  51. t.Fatalf("failed to listen and serve: %v", serveErr)
  52. }
  53. }
  54. func BenchmarkServerSTUN(b *testing.B) {
  55. b.ReportAllocs()
  56. ctx, cancel := context.WithCancel(context.Background())
  57. defer cancel()
  58. s := New(ctx)
  59. s.Listen("localhost:0")
  60. go s.Serve()
  61. addr := s.LocalAddr().(*net.UDPAddr)
  62. var resBuf [1500]byte
  63. cc, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("127.0.0.1")})
  64. if err != nil {
  65. b.Fatal(err)
  66. }
  67. tx := stun.NewTxID()
  68. req := stun.Request(tx)
  69. for range b.N {
  70. if _, err := cc.WriteToUDP(req, addr); err != nil {
  71. b.Fatal(err)
  72. }
  73. _, _, err := cc.ReadFromUDP(resBuf[:])
  74. if err != nil {
  75. b.Fatal(err)
  76. }
  77. }
  78. }