box_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package main
  2. import (
  3. "context"
  4. "net"
  5. "testing"
  6. "time"
  7. "github.com/sagernet/sing-box"
  8. "github.com/sagernet/sing-box/option"
  9. "github.com/sagernet/sing/common/control"
  10. F "github.com/sagernet/sing/common/format"
  11. M "github.com/sagernet/sing/common/metadata"
  12. N "github.com/sagernet/sing/common/network"
  13. "github.com/sagernet/sing/protocol/socks"
  14. "github.com/stretchr/testify/require"
  15. )
  16. func mkPort(t *testing.T) uint16 {
  17. var lc net.ListenConfig
  18. lc.Control = control.ReuseAddr()
  19. for {
  20. tcpListener, err := lc.Listen(context.Background(), "tcp", ":0")
  21. require.NoError(t, err)
  22. listenPort := M.SocksaddrFromNet(tcpListener.Addr()).Port
  23. tcpListener.Close()
  24. udpListener, err := lc.Listen(context.Background(), "tcp", F.ToString(":", listenPort))
  25. if err != nil {
  26. continue
  27. }
  28. udpListener.Close()
  29. return listenPort
  30. }
  31. }
  32. func startInstance(t *testing.T, options option.Options) {
  33. var err error
  34. for retry := 0; retry < 3; retry++ {
  35. instance, err := box.New(context.Background(), options)
  36. require.NoError(t, err)
  37. err = instance.Start()
  38. if err != nil {
  39. time.Sleep(5 * time.Millisecond)
  40. continue
  41. }
  42. t.Cleanup(func() {
  43. instance.Close()
  44. })
  45. }
  46. require.NoError(t, err)
  47. }
  48. func testSuit(t *testing.T, clientPort uint16, testPort uint16) {
  49. dialer := socks.NewClient(N.SystemDialer, M.ParseSocksaddrHostPort("127.0.0.1", clientPort), socks.Version5, "", "")
  50. dialTCP := func() (net.Conn, error) {
  51. return dialer.DialContext(context.Background(), "tcp", M.ParseSocksaddrHostPort("127.0.0.1", testPort))
  52. }
  53. dialUDP := func() (net.PacketConn, error) {
  54. return dialer.ListenPacket(context.Background(), M.ParseSocksaddrHostPort("127.0.0.1", testPort))
  55. }
  56. t.Run("tcp", func(t *testing.T) {
  57. t.Parallel()
  58. var err error
  59. for retry := 0; retry < 3; retry++ {
  60. err = testLargeDataWithConn(t, testPort, dialTCP)
  61. if err == nil {
  62. break
  63. }
  64. }
  65. require.NoError(t, err)
  66. })
  67. t.Run("udp", func(t *testing.T) {
  68. t.Parallel()
  69. var err error
  70. for retry := 0; retry < 3; retry++ {
  71. err = testLargeDataWithPacketConn(t, testPort, dialUDP)
  72. if err == nil {
  73. break
  74. }
  75. }
  76. require.NoError(t, err)
  77. })
  78. // require.NoError(t, testPingPongWithConn(t, testPort, dialTCP))
  79. // require.NoError(t, testPingPongWithPacketConn(t, testPort, dialUDP))
  80. // require.NoError(t, testPacketConnTimeout(t, dialUDP))
  81. }