box_test.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. instance, err := box.New(context.Background(), options)
  34. require.NoError(t, err)
  35. require.NoError(t, instance.Start())
  36. t.Cleanup(func() {
  37. instance.Close()
  38. })
  39. time.Sleep(time.Second)
  40. }
  41. func testSuit(t *testing.T, clientPort uint16, testPort uint16) {
  42. dialer := socks.NewClient(N.SystemDialer, M.ParseSocksaddrHostPort("127.0.0.1", clientPort), socks.Version5, "", "")
  43. dialTCP := func() (net.Conn, error) {
  44. return dialer.DialContext(context.Background(), "tcp", M.ParseSocksaddrHostPort("127.0.0.1", testPort))
  45. }
  46. dialUDP := func() (net.PacketConn, error) {
  47. return dialer.ListenPacket(context.Background(), M.ParseSocksaddrHostPort("127.0.0.1", testPort))
  48. }
  49. t.Run("tcp", func(t *testing.T) {
  50. t.Parallel()
  51. var err error
  52. for retry := 0; retry < 3; retry++ {
  53. err = testLargeDataWithConn(t, testPort, dialTCP)
  54. if err == nil {
  55. break
  56. }
  57. }
  58. require.NoError(t, err)
  59. })
  60. t.Run("udp", func(t *testing.T) {
  61. t.Parallel()
  62. var err error
  63. for retry := 0; retry < 3; retry++ {
  64. err = testLargeDataWithPacketConn(t, testPort, dialUDP)
  65. if err == nil {
  66. break
  67. }
  68. }
  69. require.NoError(t, err)
  70. })
  71. // require.NoError(t, testPingPongWithConn(t, testPort, dialTCP))
  72. // require.NoError(t, testPingPongWithPacketConn(t, testPort, dialUDP))
  73. // require.NoError(t, testPacketConnTimeout(t, dialUDP))
  74. }