dokodemo_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package dokodemo_test
  2. import (
  3. "net"
  4. "testing"
  5. "context"
  6. "v2ray.com/core/app"
  7. "v2ray.com/core/app/dispatcher"
  8. _ "v2ray.com/core/app/dispatcher/impl"
  9. "v2ray.com/core/app/proxyman"
  10. _ "v2ray.com/core/app/proxyman/outbound"
  11. "v2ray.com/core/common/dice"
  12. v2net "v2ray.com/core/common/net"
  13. "v2ray.com/core/proxy"
  14. . "v2ray.com/core/proxy/dokodemo"
  15. "v2ray.com/core/proxy/freedom"
  16. "v2ray.com/core/testing/assert"
  17. "v2ray.com/core/testing/servers/tcp"
  18. "v2ray.com/core/testing/servers/udp"
  19. "v2ray.com/core/transport/internet"
  20. _ "v2ray.com/core/transport/internet/tcp"
  21. )
  22. func TestDokodemoTCP(t *testing.T) {
  23. assert := assert.On(t)
  24. tcpServer := &tcp.Server{
  25. MsgProcessor: func(data []byte) []byte {
  26. buffer := make([]byte, 0, 2048)
  27. buffer = append(buffer, []byte("Processed: ")...)
  28. buffer = append(buffer, data...)
  29. return buffer
  30. },
  31. }
  32. _, err := tcpServer.Start()
  33. assert.Error(err).IsNil()
  34. defer tcpServer.Close()
  35. space := app.NewSpace()
  36. space.AddApp(new(dispatcher.Config))
  37. space.AddApp(new(proxyman.OutboundConfig))
  38. ohm := proxyman.OutboundHandlerManagerFromSpace(space)
  39. ctx := context.Background()
  40. ctx = app.ContextWithSpace(ctx, space)
  41. freedom, err := freedom.New(proxy.ContextWithOutboundMeta(ctx, &proxy.OutboundHandlerMeta{
  42. Address: v2net.LocalHostIP,
  43. StreamSettings: &internet.StreamConfig{
  44. Protocol: internet.TransportProtocol_TCP,
  45. },
  46. }), &freedom.Config{})
  47. assert.Error(err).IsNil()
  48. ohm.SetDefaultHandler(freedom)
  49. data2Send := "Data to be sent to remote."
  50. port := v2net.Port(dice.Roll(20000) + 10000)
  51. ctx = proxy.ContextWithInboundMeta(ctx, &proxy.InboundHandlerMeta{
  52. Address: v2net.LocalHostIP,
  53. Port: port,
  54. StreamSettings: &internet.StreamConfig{
  55. Protocol: internet.TransportProtocol_TCP,
  56. }})
  57. dokodemo, err := NewDokodemoDoor(ctx, &Config{
  58. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  59. Port: uint32(tcpServer.Port),
  60. NetworkList: v2net.Network_TCP.AsList(),
  61. Timeout: 600,
  62. })
  63. assert.Error(err).IsNil()
  64. defer dokodemo.Close()
  65. assert.Error(space.Initialize()).IsNil()
  66. err = dokodemo.Start()
  67. assert.Error(err).IsNil()
  68. assert.Port(port).Equals(dokodemo.Port())
  69. tcpClient, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  70. IP: []byte{127, 0, 0, 1},
  71. Port: int(port),
  72. Zone: "",
  73. })
  74. assert.Error(err).IsNil()
  75. tcpClient.Write([]byte(data2Send))
  76. tcpClient.CloseWrite()
  77. response := make([]byte, 1024)
  78. nBytes, err := tcpClient.Read(response)
  79. assert.Error(err).IsNil()
  80. tcpClient.Close()
  81. assert.String("Processed: " + data2Send).Equals(string(response[:nBytes]))
  82. }
  83. func TestDokodemoUDP(t *testing.T) {
  84. assert := assert.On(t)
  85. udpServer := &udp.Server{
  86. MsgProcessor: func(data []byte) []byte {
  87. buffer := make([]byte, 0, 2048)
  88. buffer = append(buffer, []byte("Processed: ")...)
  89. buffer = append(buffer, data...)
  90. return buffer
  91. },
  92. }
  93. _, err := udpServer.Start()
  94. assert.Error(err).IsNil()
  95. defer udpServer.Close()
  96. space := app.NewSpace()
  97. space.AddApp(new(dispatcher.Config))
  98. space.AddApp(new(proxyman.OutboundConfig))
  99. ohm := proxyman.OutboundHandlerManagerFromSpace(space)
  100. ctx := context.Background()
  101. ctx = app.ContextWithSpace(ctx, space)
  102. freedom, err := freedom.New(proxy.ContextWithOutboundMeta(ctx, &proxy.OutboundHandlerMeta{
  103. Address: v2net.AnyIP,
  104. StreamSettings: &internet.StreamConfig{
  105. Protocol: internet.TransportProtocol_TCP,
  106. },
  107. }), &freedom.Config{})
  108. assert.Error(err).IsNil()
  109. ohm.SetDefaultHandler(freedom)
  110. data2Send := "Data to be sent to remote."
  111. port := v2net.Port(dice.Roll(20000) + 10000)
  112. ctx = proxy.ContextWithInboundMeta(ctx, &proxy.InboundHandlerMeta{
  113. Address: v2net.LocalHostIP,
  114. Port: port,
  115. StreamSettings: &internet.StreamConfig{
  116. Protocol: internet.TransportProtocol_TCP,
  117. }})
  118. dokodemo, err := NewDokodemoDoor(ctx, &Config{
  119. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  120. Port: uint32(udpServer.Port),
  121. NetworkList: v2net.Network_UDP.AsList(),
  122. Timeout: 600,
  123. })
  124. assert.Error(err).IsNil()
  125. defer dokodemo.Close()
  126. assert.Error(space.Initialize()).IsNil()
  127. err = dokodemo.Start()
  128. assert.Error(err).IsNil()
  129. assert.Port(port).Equals(dokodemo.Port())
  130. udpClient, err := net.DialUDP("udp", nil, &net.UDPAddr{
  131. IP: []byte{127, 0, 0, 1},
  132. Port: int(port),
  133. Zone: "",
  134. })
  135. assert.Error(err).IsNil()
  136. defer udpClient.Close()
  137. udpClient.Write([]byte(data2Send))
  138. response := make([]byte, 1024)
  139. nBytes, addr, err := udpClient.ReadFromUDP(response)
  140. assert.Error(err).IsNil()
  141. assert.IP(addr.IP).Equals(v2net.LocalHostIP.IP())
  142. assert.Bytes(response[:nBytes]).Equals([]byte("Processed: " + data2Send))
  143. }