shadowsocks_2022_test.go 5.6 KB

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