feature_test.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. package scenarios
  2. import (
  3. "net"
  4. "testing"
  5. "v2ray.com/core"
  6. v2net "v2ray.com/core/common/net"
  7. "v2ray.com/core/common/protocol"
  8. "v2ray.com/core/common/serial"
  9. "v2ray.com/core/common/uuid"
  10. "v2ray.com/core/proxy/blackhole"
  11. "v2ray.com/core/proxy/dokodemo"
  12. "v2ray.com/core/proxy/freedom"
  13. "v2ray.com/core/proxy/vmess"
  14. "v2ray.com/core/proxy/vmess/inbound"
  15. "v2ray.com/core/proxy/vmess/outbound"
  16. "v2ray.com/core/testing/assert"
  17. "v2ray.com/core/testing/servers/tcp"
  18. "v2ray.com/core/transport/internet"
  19. )
  20. func TestPassiveConnection(t *testing.T) {
  21. assert := assert.On(t)
  22. tcpServer := tcp.Server{
  23. MsgProcessor: xor,
  24. SendFirst: []byte("send first"),
  25. }
  26. dest, err := tcpServer.Start()
  27. assert.Error(err).IsNil()
  28. defer tcpServer.Close()
  29. serverPort := pickPort()
  30. serverConfig := &core.Config{
  31. Inbound: []*core.InboundConnectionConfig{
  32. {
  33. PortRange: v2net.SinglePortRange(serverPort),
  34. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  35. AllowPassiveConnection: true,
  36. Settings: serial.ToTypedMessage(&dokodemo.Config{
  37. Address: v2net.NewIPOrDomain(dest.Address),
  38. Port: uint32(dest.Port),
  39. NetworkList: &v2net.NetworkList{
  40. Network: []v2net.Network{v2net.Network_TCP},
  41. },
  42. }),
  43. },
  44. },
  45. Outbound: []*core.OutboundConnectionConfig{
  46. {
  47. Settings: serial.ToTypedMessage(&freedom.Config{}),
  48. },
  49. },
  50. }
  51. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  52. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  53. IP: []byte{127, 0, 0, 1},
  54. Port: int(serverPort),
  55. })
  56. assert.Error(err).IsNil()
  57. {
  58. response := make([]byte, 1024)
  59. nBytes, err := conn.Read(response)
  60. assert.Error(err).IsNil()
  61. assert.String(string(response[:nBytes])).Equals("send first")
  62. }
  63. payload := "dokodemo request."
  64. {
  65. nBytes, err := conn.Write([]byte(payload))
  66. assert.Error(err).IsNil()
  67. assert.Int(nBytes).Equals(len(payload))
  68. }
  69. {
  70. response := make([]byte, 1024)
  71. nBytes, err := conn.Read(response)
  72. assert.Error(err).IsNil()
  73. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  74. }
  75. assert.Error(conn.Close()).IsNil()
  76. CloseAllServers()
  77. }
  78. func TestProxy(t *testing.T) {
  79. assert := assert.On(t)
  80. tcpServer := tcp.Server{
  81. MsgProcessor: xor,
  82. }
  83. dest, err := tcpServer.Start()
  84. assert.Error(err).IsNil()
  85. defer tcpServer.Close()
  86. serverUserID := protocol.NewID(uuid.New())
  87. serverPort := pickPort()
  88. serverConfig := &core.Config{
  89. Inbound: []*core.InboundConnectionConfig{
  90. {
  91. PortRange: v2net.SinglePortRange(serverPort),
  92. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  93. Settings: serial.ToTypedMessage(&inbound.Config{
  94. User: []*protocol.User{
  95. {
  96. Account: serial.ToTypedMessage(&vmess.Account{
  97. Id: serverUserID.String(),
  98. }),
  99. },
  100. },
  101. }),
  102. },
  103. },
  104. Outbound: []*core.OutboundConnectionConfig{
  105. {
  106. Settings: serial.ToTypedMessage(&freedom.Config{}),
  107. },
  108. },
  109. }
  110. proxyUserID := protocol.NewID(uuid.New())
  111. proxyPort := pickPort()
  112. proxyConfig := &core.Config{
  113. Inbound: []*core.InboundConnectionConfig{
  114. {
  115. PortRange: v2net.SinglePortRange(proxyPort),
  116. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  117. Settings: serial.ToTypedMessage(&inbound.Config{
  118. User: []*protocol.User{
  119. {
  120. Account: serial.ToTypedMessage(&vmess.Account{
  121. Id: proxyUserID.String(),
  122. }),
  123. },
  124. },
  125. }),
  126. },
  127. },
  128. Outbound: []*core.OutboundConnectionConfig{
  129. {
  130. Settings: serial.ToTypedMessage(&freedom.Config{}),
  131. },
  132. },
  133. }
  134. clientPort := pickPort()
  135. clientConfig := &core.Config{
  136. Inbound: []*core.InboundConnectionConfig{
  137. {
  138. PortRange: v2net.SinglePortRange(clientPort),
  139. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  140. Settings: serial.ToTypedMessage(&dokodemo.Config{
  141. Address: v2net.NewIPOrDomain(dest.Address),
  142. Port: uint32(dest.Port),
  143. NetworkList: &v2net.NetworkList{
  144. Network: []v2net.Network{v2net.Network_TCP},
  145. },
  146. }),
  147. },
  148. },
  149. Outbound: []*core.OutboundConnectionConfig{
  150. {
  151. Settings: serial.ToTypedMessage(&outbound.Config{
  152. Receiver: []*protocol.ServerEndpoint{
  153. {
  154. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  155. Port: uint32(serverPort),
  156. User: []*protocol.User{
  157. {
  158. Account: serial.ToTypedMessage(&vmess.Account{
  159. Id: serverUserID.String(),
  160. }),
  161. },
  162. },
  163. },
  164. },
  165. }),
  166. ProxySettings: &internet.ProxyConfig{
  167. Tag: "proxy",
  168. },
  169. },
  170. {
  171. Tag: "proxy",
  172. Settings: serial.ToTypedMessage(&outbound.Config{
  173. Receiver: []*protocol.ServerEndpoint{
  174. {
  175. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  176. Port: uint32(proxyPort),
  177. User: []*protocol.User{
  178. {
  179. Account: serial.ToTypedMessage(&vmess.Account{
  180. Id: proxyUserID.String(),
  181. }),
  182. },
  183. },
  184. },
  185. },
  186. }),
  187. },
  188. },
  189. }
  190. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  191. assert.Error(InitializeServerConfig(proxyConfig)).IsNil()
  192. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  193. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  194. IP: []byte{127, 0, 0, 1},
  195. Port: int(clientPort),
  196. })
  197. assert.Error(err).IsNil()
  198. payload := "dokodemo request."
  199. nBytes, err := conn.Write([]byte(payload))
  200. assert.Error(err).IsNil()
  201. assert.Int(nBytes).Equals(len(payload))
  202. response := make([]byte, 1024)
  203. nBytes, err = conn.Read(response)
  204. assert.Error(err).IsNil()
  205. assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload)))
  206. assert.Error(conn.Close()).IsNil()
  207. CloseAllServers()
  208. }
  209. func TestBlackhole(t *testing.T) {
  210. assert := assert.On(t)
  211. tcpServer := tcp.Server{
  212. MsgProcessor: xor,
  213. }
  214. dest, err := tcpServer.Start()
  215. assert.Error(err).IsNil()
  216. defer tcpServer.Close()
  217. serverPort := pickPort()
  218. serverConfig := &core.Config{
  219. Inbound: []*core.InboundConnectionConfig{
  220. {
  221. PortRange: v2net.SinglePortRange(serverPort),
  222. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  223. AllowPassiveConnection: true,
  224. Settings: serial.ToTypedMessage(&dokodemo.Config{
  225. Address: v2net.NewIPOrDomain(dest.Address),
  226. Port: uint32(dest.Port),
  227. NetworkList: &v2net.NetworkList{
  228. Network: []v2net.Network{v2net.Network_TCP},
  229. },
  230. }),
  231. },
  232. },
  233. Outbound: []*core.OutboundConnectionConfig{
  234. {
  235. Settings: serial.ToTypedMessage(&blackhole.Config{}),
  236. },
  237. },
  238. }
  239. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  240. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  241. IP: []byte{127, 0, 0, 1},
  242. Port: int(serverPort),
  243. })
  244. assert.Error(err).IsNil()
  245. payload := "dokodemo request."
  246. {
  247. nBytes, err := conn.Write([]byte(payload))
  248. assert.Error(err).IsNil()
  249. assert.Int(nBytes).Equals(len(payload))
  250. }
  251. {
  252. response := make([]byte, 1024)
  253. _, err := conn.Read(response)
  254. assert.Error(err).IsNotNil()
  255. }
  256. assert.Error(conn.Close()).IsNil()
  257. CloseAllServers()
  258. }