relay_shutdown_test.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package tuic
  2. import (
  3. "bytes"
  4. "context"
  5. "io"
  6. "net"
  7. "testing"
  8. "time"
  9. )
  10. func TestAudit3CloseMustInterruptIdleTCPRelay(t *testing.T) {
  11. listener, err := net.Listen("tcp", "127.0.0.1:0")
  12. if err != nil {
  13. t.Fatal(err)
  14. }
  15. defer listener.Close()
  16. release := make(chan struct{})
  17. defer close(release)
  18. peerFIN := make(chan struct{})
  19. ready := make(chan struct{})
  20. go func() {
  21. c, err := listener.Accept()
  22. if err != nil {
  23. return
  24. }
  25. defer c.Close()
  26. var greeting [4]byte
  27. if _, err := io.ReadFull(c, greeting[:]); err != nil {
  28. return
  29. }
  30. c.Write([]byte{5, 0})
  31. var req [10]byte
  32. if _, err := io.ReadFull(c, req[:]); err != nil {
  33. return
  34. }
  35. c.Write([]byte{5, 0, 0, 1, 127, 0, 0, 1, 0, 0})
  36. var payload [1]byte
  37. if _, err := io.ReadFull(c, payload[:]); err != nil {
  38. return
  39. }
  40. c.Write(payload[:])
  41. close(ready)
  42. io.Copy(io.Discard, c)
  43. close(peerFIN)
  44. <-release
  45. }()
  46. server, conn, _, _ := startLifecycleTestServer(t, listener.Addr().String(), "close-idle@audit3")
  47. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  48. defer cancel()
  49. stream, err := conn.OpenStreamSync(ctx)
  50. if err != nil {
  51. t.Fatal(err)
  52. }
  53. var cmd bytes.Buffer
  54. cmd.Write([]byte{ProtocolVersion, CmdConnect})
  55. WriteAddress(&cmd, &Address{Type: AddrTypeIPv4, IP: net.ParseIP("1.1.1.1"), Port: 443})
  56. cmd.WriteByte('x')
  57. if _, err := stream.Write(cmd.Bytes()); err != nil {
  58. t.Fatal(err)
  59. }
  60. var echo [1]byte
  61. if _, err := io.ReadFull(stream, echo[:]); err != nil {
  62. t.Fatal(err)
  63. }
  64. <-ready
  65. closed := make(chan error, 1)
  66. started := time.Now()
  67. go func() { closed <- server.Close() }()
  68. select {
  69. case err := <-closed:
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. case <-time.After(time.Second):
  74. t.Fatalf("Server.Close waited for idle TCP peer after %s", time.Since(started))
  75. }
  76. select {
  77. case <-peerFIN:
  78. case <-time.After(time.Second):
  79. t.Fatal("upstream socket did not close")
  80. }
  81. _, _, deltas := server.CollectAllTraffic()
  82. if len(deltas) != 1 || deltas[0].Up != 1 || deltas[0].Down != 1 {
  83. t.Fatalf("final traffic: %+v", deltas)
  84. }
  85. }