dokodemo_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package scenarios
  2. import (
  3. "google.golang.org/protobuf/types/known/anypb"
  4. "testing"
  5. "time"
  6. "golang.org/x/sync/errgroup"
  7. core "github.com/v2fly/v2ray-core/v4"
  8. "github.com/v2fly/v2ray-core/v4/app/log"
  9. "github.com/v2fly/v2ray-core/v4/app/proxyman"
  10. "github.com/v2fly/v2ray-core/v4/common"
  11. clog "github.com/v2fly/v2ray-core/v4/common/log"
  12. "github.com/v2fly/v2ray-core/v4/common/net"
  13. "github.com/v2fly/v2ray-core/v4/common/protocol"
  14. "github.com/v2fly/v2ray-core/v4/common/serial"
  15. "github.com/v2fly/v2ray-core/v4/common/uuid"
  16. "github.com/v2fly/v2ray-core/v4/proxy/dokodemo"
  17. "github.com/v2fly/v2ray-core/v4/proxy/freedom"
  18. "github.com/v2fly/v2ray-core/v4/proxy/vmess"
  19. "github.com/v2fly/v2ray-core/v4/proxy/vmess/inbound"
  20. "github.com/v2fly/v2ray-core/v4/proxy/vmess/outbound"
  21. "github.com/v2fly/v2ray-core/v4/testing/servers/tcp"
  22. "github.com/v2fly/v2ray-core/v4/testing/servers/udp"
  23. )
  24. func TestDokodemoTCP(t *testing.T) {
  25. tcpServer := tcp.Server{
  26. MsgProcessor: xor,
  27. }
  28. dest, err := tcpServer.Start()
  29. common.Must(err)
  30. defer tcpServer.Close()
  31. userID := protocol.NewID(uuid.New())
  32. serverPort := tcp.PickPort()
  33. serverConfig := &core.Config{
  34. App: []*anypb.Any{
  35. serial.ToTypedMessage(&log.Config{
  36. ErrorLogLevel: clog.Severity_Debug,
  37. ErrorLogType: log.LogType_Console,
  38. }),
  39. },
  40. Inbound: []*core.InboundHandlerConfig{
  41. {
  42. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  43. PortRange: net.SinglePortRange(serverPort),
  44. Listen: net.NewIPOrDomain(net.LocalHostIP),
  45. }),
  46. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  47. User: []*protocol.User{
  48. {
  49. Account: serial.ToTypedMessage(&vmess.Account{
  50. Id: userID.String(),
  51. }),
  52. },
  53. },
  54. }),
  55. },
  56. },
  57. Outbound: []*core.OutboundHandlerConfig{
  58. {
  59. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  60. },
  61. },
  62. }
  63. clientPort := uint32(tcp.PickPort())
  64. clientPortRange := uint32(5)
  65. clientConfig := &core.Config{
  66. App: []*anypb.Any{
  67. serial.ToTypedMessage(&log.Config{
  68. ErrorLogLevel: clog.Severity_Debug,
  69. ErrorLogType: log.LogType_Console,
  70. }),
  71. },
  72. Inbound: []*core.InboundHandlerConfig{
  73. {
  74. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  75. PortRange: &net.PortRange{From: clientPort, To: clientPort + clientPortRange},
  76. Listen: net.NewIPOrDomain(net.LocalHostIP),
  77. }),
  78. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  79. Address: net.NewIPOrDomain(dest.Address),
  80. Port: uint32(dest.Port),
  81. NetworkList: &net.NetworkList{
  82. Network: []net.Network{net.Network_TCP},
  83. },
  84. }),
  85. },
  86. },
  87. Outbound: []*core.OutboundHandlerConfig{
  88. {
  89. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  90. Receiver: []*protocol.ServerEndpoint{
  91. {
  92. Address: net.NewIPOrDomain(net.LocalHostIP),
  93. Port: uint32(serverPort),
  94. User: []*protocol.User{
  95. {
  96. Account: serial.ToTypedMessage(&vmess.Account{
  97. Id: userID.String(),
  98. }),
  99. },
  100. },
  101. },
  102. },
  103. }),
  104. },
  105. },
  106. }
  107. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  108. common.Must(err)
  109. defer CloseAllServers(servers)
  110. for port := clientPort; port <= clientPort+clientPortRange; port++ {
  111. if err := testTCPConn(net.Port(port), 1024, time.Second*2)(); err != nil {
  112. t.Error(err)
  113. }
  114. }
  115. }
  116. func TestDokodemoUDP(t *testing.T) {
  117. udpServer := udp.Server{
  118. MsgProcessor: xor,
  119. }
  120. dest, err := udpServer.Start()
  121. common.Must(err)
  122. defer udpServer.Close()
  123. userID := protocol.NewID(uuid.New())
  124. serverPort := tcp.PickPort()
  125. serverConfig := &core.Config{
  126. Inbound: []*core.InboundHandlerConfig{
  127. {
  128. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  129. PortRange: net.SinglePortRange(serverPort),
  130. Listen: net.NewIPOrDomain(net.LocalHostIP),
  131. }),
  132. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  133. User: []*protocol.User{
  134. {
  135. Account: serial.ToTypedMessage(&vmess.Account{
  136. Id: userID.String(),
  137. }),
  138. },
  139. },
  140. }),
  141. },
  142. },
  143. Outbound: []*core.OutboundHandlerConfig{
  144. {
  145. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  146. },
  147. },
  148. }
  149. clientPort := uint32(tcp.PickPort())
  150. clientPortRange := uint32(5)
  151. clientConfig := &core.Config{
  152. Inbound: []*core.InboundHandlerConfig{
  153. {
  154. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  155. PortRange: &net.PortRange{From: clientPort, To: clientPort + clientPortRange},
  156. Listen: net.NewIPOrDomain(net.LocalHostIP),
  157. }),
  158. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  159. Address: net.NewIPOrDomain(dest.Address),
  160. Port: uint32(dest.Port),
  161. NetworkList: &net.NetworkList{
  162. Network: []net.Network{net.Network_UDP},
  163. },
  164. }),
  165. },
  166. },
  167. Outbound: []*core.OutboundHandlerConfig{
  168. {
  169. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  170. Receiver: []*protocol.ServerEndpoint{
  171. {
  172. Address: net.NewIPOrDomain(net.LocalHostIP),
  173. Port: uint32(serverPort),
  174. User: []*protocol.User{
  175. {
  176. Account: serial.ToTypedMessage(&vmess.Account{
  177. Id: userID.String(),
  178. }),
  179. },
  180. },
  181. },
  182. },
  183. }),
  184. },
  185. },
  186. }
  187. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  188. common.Must(err)
  189. defer CloseAllServers(servers)
  190. var errg errgroup.Group
  191. for port := clientPort; port <= clientPort+clientPortRange; port++ {
  192. errg.Go(testUDPConn(net.Port(port), 1024, time.Second*5))
  193. }
  194. if err := errg.Wait(); err != nil {
  195. t.Error(err)
  196. }
  197. }