github.com/xtls/xray-core@v1.8.12-0.20240518155711-3168d27b0bdb/testing/scenarios/shadowsocks_2022_test.go (about)

     1  package scenarios
     2  
     3  import (
     4  	"crypto/rand"
     5  	"encoding/base64"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/sagernet/sing-shadowsocks/shadowaead_2022"
    10  	"github.com/xtls/xray-core/app/log"
    11  	"github.com/xtls/xray-core/app/proxyman"
    12  	"github.com/xtls/xray-core/common"
    13  	clog "github.com/xtls/xray-core/common/log"
    14  	"github.com/xtls/xray-core/common/net"
    15  	"github.com/xtls/xray-core/common/serial"
    16  	"github.com/xtls/xray-core/core"
    17  	"github.com/xtls/xray-core/proxy/dokodemo"
    18  	"github.com/xtls/xray-core/proxy/freedom"
    19  	"github.com/xtls/xray-core/proxy/shadowsocks_2022"
    20  	"github.com/xtls/xray-core/testing/servers/tcp"
    21  	"github.com/xtls/xray-core/testing/servers/udp"
    22  	"golang.org/x/sync/errgroup"
    23  )
    24  
    25  func TestShadowsocks2022Tcp(t *testing.T) {
    26  	for _, method := range shadowaead_2022.List {
    27  		password := make([]byte, 32)
    28  		rand.Read(password)
    29  		t.Run(method, func(t *testing.T) {
    30  			testShadowsocks2022Tcp(t, method, base64.StdEncoding.EncodeToString(password))
    31  		})
    32  	}
    33  }
    34  
    35  func TestShadowsocks2022UdpAES128(t *testing.T) {
    36  	password := make([]byte, 32)
    37  	rand.Read(password)
    38  	testShadowsocks2022Udp(t, shadowaead_2022.List[0], base64.StdEncoding.EncodeToString(password))
    39  }
    40  
    41  func TestShadowsocks2022UdpAES256(t *testing.T) {
    42  	password := make([]byte, 32)
    43  	rand.Read(password)
    44  	testShadowsocks2022Udp(t, shadowaead_2022.List[1], base64.StdEncoding.EncodeToString(password))
    45  }
    46  
    47  func TestShadowsocks2022UdpChacha(t *testing.T) {
    48  	password := make([]byte, 32)
    49  	rand.Read(password)
    50  	testShadowsocks2022Udp(t, shadowaead_2022.List[2], base64.StdEncoding.EncodeToString(password))
    51  }
    52  
    53  func testShadowsocks2022Tcp(t *testing.T, method string, password string) {
    54  	tcpServer := tcp.Server{
    55  		MsgProcessor: xor,
    56  	}
    57  	dest, err := tcpServer.Start()
    58  	common.Must(err)
    59  	defer tcpServer.Close()
    60  
    61  	serverPort := tcp.PickPort()
    62  	serverConfig := &core.Config{
    63  		App: []*serial.TypedMessage{
    64  			serial.ToTypedMessage(&log.Config{
    65  				ErrorLogLevel: clog.Severity_Debug,
    66  				ErrorLogType:  log.LogType_Console,
    67  			}),
    68  		},
    69  		Inbound: []*core.InboundHandlerConfig{
    70  			{
    71  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
    72  					PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
    73  					Listen:   net.NewIPOrDomain(net.LocalHostIP),
    74  				}),
    75  				ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ServerConfig{
    76  					Method:  method,
    77  					Key:     password,
    78  					Network: []net.Network{net.Network_TCP},
    79  				}),
    80  			},
    81  		},
    82  		Outbound: []*core.OutboundHandlerConfig{
    83  			{
    84  				ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
    85  			},
    86  		},
    87  	}
    88  
    89  	clientPort := tcp.PickPort()
    90  	clientConfig := &core.Config{
    91  		App: []*serial.TypedMessage{
    92  			serial.ToTypedMessage(&log.Config{
    93  				ErrorLogLevel: clog.Severity_Debug,
    94  				ErrorLogType:  log.LogType_Console,
    95  			}),
    96  		},
    97  		Inbound: []*core.InboundHandlerConfig{
    98  			{
    99  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   100  					PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
   101  					Listen:   net.NewIPOrDomain(net.LocalHostIP),
   102  				}),
   103  				ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
   104  					Address:  net.NewIPOrDomain(dest.Address),
   105  					Port:     uint32(dest.Port),
   106  					Networks: []net.Network{net.Network_TCP},
   107  				}),
   108  			},
   109  		},
   110  		Outbound: []*core.OutboundHandlerConfig{
   111  			{
   112  				ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ClientConfig{
   113  					Address: net.NewIPOrDomain(net.LocalHostIP),
   114  					Port:    uint32(serverPort),
   115  					Method:  method,
   116  					Key:     password,
   117  				}),
   118  			},
   119  		},
   120  	}
   121  
   122  	servers, err := InitializeServerConfigs(serverConfig, clientConfig)
   123  	common.Must(err)
   124  	defer CloseAllServers(servers)
   125  
   126  	var errGroup errgroup.Group
   127  	for i := 0; i < 10; i++ {
   128  		errGroup.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
   129  	}
   130  
   131  	if err := errGroup.Wait(); err != nil {
   132  		t.Error(err)
   133  	}
   134  }
   135  
   136  func testShadowsocks2022Udp(t *testing.T, method string, password string) {
   137  	udpServer := udp.Server{
   138  		MsgProcessor: xor,
   139  	}
   140  	udpDest, err := udpServer.Start()
   141  	common.Must(err)
   142  	defer udpServer.Close()
   143  
   144  	serverPort := udp.PickPort()
   145  	serverConfig := &core.Config{
   146  		App: []*serial.TypedMessage{
   147  			serial.ToTypedMessage(&log.Config{
   148  				ErrorLogLevel: clog.Severity_Debug,
   149  				ErrorLogType:  log.LogType_Console,
   150  			}),
   151  		},
   152  		Inbound: []*core.InboundHandlerConfig{
   153  			{
   154  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   155  					PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
   156  					Listen:   net.NewIPOrDomain(net.LocalHostIP),
   157  				}),
   158  				ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ServerConfig{
   159  					Method:  method,
   160  					Key:     password,
   161  					Network: []net.Network{net.Network_UDP},
   162  				}),
   163  			},
   164  		},
   165  		Outbound: []*core.OutboundHandlerConfig{
   166  			{
   167  				ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
   168  			},
   169  		},
   170  	}
   171  
   172  	udpClientPort := udp.PickPort()
   173  	clientConfig := &core.Config{
   174  		App: []*serial.TypedMessage{
   175  			serial.ToTypedMessage(&log.Config{
   176  				ErrorLogLevel: clog.Severity_Debug,
   177  				ErrorLogType:  log.LogType_Console,
   178  			}),
   179  		},
   180  		Inbound: []*core.InboundHandlerConfig{
   181  			{
   182  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   183  					PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(udpClientPort)}},
   184  					Listen:   net.NewIPOrDomain(net.LocalHostIP),
   185  				}),
   186  				ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
   187  					Address:  net.NewIPOrDomain(udpDest.Address),
   188  					Port:     uint32(udpDest.Port),
   189  					Networks: []net.Network{net.Network_UDP},
   190  				}),
   191  			},
   192  		},
   193  		Outbound: []*core.OutboundHandlerConfig{
   194  			{
   195  				ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ClientConfig{
   196  					Address: net.NewIPOrDomain(net.LocalHostIP),
   197  					Port:    uint32(serverPort),
   198  					Method:  method,
   199  					Key:     password,
   200  				}),
   201  			},
   202  		},
   203  	}
   204  
   205  	servers, err := InitializeServerConfigs(serverConfig, clientConfig)
   206  	common.Must(err)
   207  	defer CloseAllServers(servers)
   208  
   209  	var errGroup errgroup.Group
   210  	for i := 0; i < 2; i++ {
   211  		errGroup.Go(testUDPConn(udpClientPort, 1024, time.Second*5))
   212  	}
   213  
   214  	if err := errGroup.Wait(); err != nil {
   215  		t.Error(err)
   216  	}
   217  }