box_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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(port uint16) (net.Conn, error) {
  44. return dialer.DialContext(context.Background(), "tcp", M.ParseSocksaddrHostPort("127.0.0.1", port))
  45. }
  46. dialUDP := func(port uint16) (net.PacketConn, error) {
  47. return dialer.ListenPacket(context.Background(), M.ParseSocksaddrHostPort("127.0.0.1", port))
  48. }
  49. require.NoError(t, testPingPongWithConn(t, dialTCP))
  50. require.NoError(t, testLargeDataWithConn(t, dialTCP))
  51. require.NoError(t, testPingPongWithPacketConn(t, dialUDP))
  52. require.NoError(t, testLargeDataWithPacketConn(t, dialUDP))
  53. require.NoError(t, testPacketConnTimeout(t, dialUDP))
  54. }