box_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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/bufio"
  10. "github.com/sagernet/sing/common/debug"
  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 startInstance(t *testing.T, options option.Options) {
  17. if debug.Enabled {
  18. options.Log = &option.LogOptions{
  19. Level: "trace",
  20. }
  21. } else {
  22. options.Log = &option.LogOptions{
  23. Level: "warning",
  24. }
  25. }
  26. var instance *box.Box
  27. var err error
  28. for retry := 0; retry < 3; retry++ {
  29. instance, err = box.New(context.Background(), options)
  30. require.NoError(t, err)
  31. err = instance.Start()
  32. if err != nil {
  33. time.Sleep(time.Second)
  34. continue
  35. }
  36. break
  37. }
  38. require.NoError(t, err)
  39. t.Cleanup(func() {
  40. instance.Close()
  41. })
  42. }
  43. func testSuit(t *testing.T, clientPort uint16, testPort uint16) {
  44. dialer := socks.NewClient(N.SystemDialer, M.ParseSocksaddrHostPort("127.0.0.1", clientPort), socks.Version5, "", "")
  45. dialTCP := func() (net.Conn, error) {
  46. return dialer.DialContext(context.Background(), "tcp", M.ParseSocksaddrHostPort("127.0.0.1", testPort))
  47. }
  48. dialUDP := func() (net.PacketConn, error) {
  49. return dialer.ListenPacket(context.Background(), M.ParseSocksaddrHostPort("127.0.0.1", testPort))
  50. }
  51. require.NoError(t, testPingPongWithConn(t, testPort, dialTCP))
  52. require.NoError(t, testPingPongWithPacketConn(t, testPort, dialUDP))
  53. require.NoError(t, testLargeDataWithConn(t, testPort, dialTCP))
  54. require.NoError(t, testLargeDataWithPacketConn(t, testPort, dialUDP))
  55. // require.NoError(t, testPacketConnTimeout(t, dialUDP))
  56. }
  57. func testTCP(t *testing.T, clientPort uint16, testPort uint16) {
  58. dialer := socks.NewClient(N.SystemDialer, M.ParseSocksaddrHostPort("127.0.0.1", clientPort), socks.Version5, "", "")
  59. dialTCP := func() (net.Conn, error) {
  60. return dialer.DialContext(context.Background(), "tcp", M.ParseSocksaddrHostPort("127.0.0.1", testPort))
  61. }
  62. require.NoError(t, testPingPongWithConn(t, testPort, dialTCP))
  63. require.NoError(t, testLargeDataWithConn(t, testPort, dialTCP))
  64. }
  65. func testSuitSimple(t *testing.T, clientPort uint16, testPort uint16) {
  66. dialer := socks.NewClient(N.SystemDialer, M.ParseSocksaddrHostPort("127.0.0.1", clientPort), socks.Version5, "", "")
  67. dialTCP := func() (net.Conn, error) {
  68. return dialer.DialContext(context.Background(), "tcp", M.ParseSocksaddrHostPort("127.0.0.1", testPort))
  69. }
  70. dialUDP := func() (net.PacketConn, error) {
  71. return dialer.ListenPacket(context.Background(), M.ParseSocksaddrHostPort("127.0.0.1", testPort))
  72. }
  73. require.NoError(t, testPingPongWithConn(t, testPort, dialTCP))
  74. require.NoError(t, testPingPongWithPacketConn(t, testPort, dialUDP))
  75. require.NoError(t, testPingPongWithConn(t, testPort, dialTCP))
  76. require.NoError(t, testPingPongWithPacketConn(t, testPort, dialUDP))
  77. }
  78. func testSuitWg(t *testing.T, clientPort uint16, testPort uint16) {
  79. dialer := socks.NewClient(N.SystemDialer, M.ParseSocksaddrHostPort("127.0.0.1", clientPort), socks.Version5, "", "")
  80. dialTCP := func() (net.Conn, error) {
  81. return dialer.DialContext(context.Background(), "tcp", M.ParseSocksaddrHostPort("10.0.0.1", testPort))
  82. }
  83. dialUDP := func() (net.PacketConn, error) {
  84. conn, err := dialer.DialContext(context.Background(), "udp", M.ParseSocksaddrHostPort("10.0.0.1", testPort))
  85. if err != nil {
  86. return nil, err
  87. }
  88. return bufio.NewUnbindPacketConn(conn), nil
  89. }
  90. require.NoError(t, testLargeDataWithConn(t, testPort, dialTCP))
  91. require.NoError(t, testLargeDataWithPacketConn(t, testPort, dialUDP))
  92. // require.NoError(t, testPingPongWithConn(t, testPort, dialTCP))
  93. // require.NoError(t, testPingPongWithPacketConn(t, testPort, dialUDP))
  94. }