functions_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package core_test
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "io"
  6. "testing"
  7. "time"
  8. "github.com/golang/protobuf/proto"
  9. "github.com/google/go-cmp/cmp"
  10. "github.com/xtls/xray-core/app/dispatcher"
  11. "github.com/xtls/xray-core/app/proxyman"
  12. "github.com/xtls/xray-core/common"
  13. "github.com/xtls/xray-core/common/net"
  14. "github.com/xtls/xray-core/common/serial"
  15. core "github.com/xtls/xray-core/core"
  16. "github.com/xtls/xray-core/proxy/freedom"
  17. "github.com/xtls/xray-core/testing/servers/tcp"
  18. "github.com/xtls/xray-core/testing/servers/udp"
  19. )
  20. func xor(b []byte) []byte {
  21. r := make([]byte, len(b))
  22. for i, v := range b {
  23. r[i] = v ^ 'c'
  24. }
  25. return r
  26. }
  27. func xor2(b []byte) []byte {
  28. r := make([]byte, len(b))
  29. for i, v := range b {
  30. r[i] = v ^ 'd'
  31. }
  32. return r
  33. }
  34. func TestXrayDial(t *testing.T) {
  35. tcpServer := tcp.Server{
  36. MsgProcessor: xor,
  37. }
  38. dest, err := tcpServer.Start()
  39. common.Must(err)
  40. defer tcpServer.Close()
  41. config := &core.Config{
  42. App: []*serial.TypedMessage{
  43. serial.ToTypedMessage(&dispatcher.Config{}),
  44. serial.ToTypedMessage(&proxyman.InboundConfig{}),
  45. serial.ToTypedMessage(&proxyman.OutboundConfig{}),
  46. },
  47. Outbound: []*core.OutboundHandlerConfig{
  48. {
  49. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  50. },
  51. },
  52. }
  53. cfgBytes, err := proto.Marshal(config)
  54. common.Must(err)
  55. server, err := core.StartInstance("protobuf", cfgBytes)
  56. common.Must(err)
  57. defer server.Close()
  58. conn, err := core.Dial(context.Background(), server, dest)
  59. common.Must(err)
  60. defer conn.Close()
  61. const size = 10240 * 1024
  62. payload := make([]byte, size)
  63. common.Must2(rand.Read(payload))
  64. if _, err := conn.Write(payload); err != nil {
  65. t.Fatal(err)
  66. }
  67. receive := make([]byte, size)
  68. if _, err := io.ReadFull(conn, receive); err != nil {
  69. t.Fatal("failed to read all response: ", err)
  70. }
  71. if r := cmp.Diff(xor(receive), payload); r != "" {
  72. t.Error(r)
  73. }
  74. }
  75. func TestXrayDialUDPConn(t *testing.T) {
  76. udpServer := udp.Server{
  77. MsgProcessor: xor,
  78. }
  79. dest, err := udpServer.Start()
  80. common.Must(err)
  81. defer udpServer.Close()
  82. config := &core.Config{
  83. App: []*serial.TypedMessage{
  84. serial.ToTypedMessage(&dispatcher.Config{}),
  85. serial.ToTypedMessage(&proxyman.InboundConfig{}),
  86. serial.ToTypedMessage(&proxyman.OutboundConfig{}),
  87. },
  88. Outbound: []*core.OutboundHandlerConfig{
  89. {
  90. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  91. },
  92. },
  93. }
  94. cfgBytes, err := proto.Marshal(config)
  95. common.Must(err)
  96. server, err := core.StartInstance("protobuf", cfgBytes)
  97. common.Must(err)
  98. defer server.Close()
  99. conn, err := core.Dial(context.Background(), server, dest)
  100. common.Must(err)
  101. defer conn.Close()
  102. const size = 1024
  103. payload := make([]byte, size)
  104. common.Must2(rand.Read(payload))
  105. for i := 0; i < 2; i++ {
  106. if _, err := conn.Write(payload); err != nil {
  107. t.Fatal(err)
  108. }
  109. }
  110. time.Sleep(time.Millisecond * 500)
  111. receive := make([]byte, size*2)
  112. for i := 0; i < 2; i++ {
  113. n, err := conn.Read(receive)
  114. if err != nil {
  115. t.Fatal("expect no error, but got ", err)
  116. }
  117. if n != size {
  118. t.Fatal("expect read size ", size, " but got ", n)
  119. }
  120. if r := cmp.Diff(xor(receive[:n]), payload); r != "" {
  121. t.Fatal(r)
  122. }
  123. }
  124. }
  125. func TestXrayDialUDP(t *testing.T) {
  126. udpServer1 := udp.Server{
  127. MsgProcessor: xor,
  128. }
  129. dest1, err := udpServer1.Start()
  130. common.Must(err)
  131. defer udpServer1.Close()
  132. udpServer2 := udp.Server{
  133. MsgProcessor: xor2,
  134. }
  135. dest2, err := udpServer2.Start()
  136. common.Must(err)
  137. defer udpServer2.Close()
  138. config := &core.Config{
  139. App: []*serial.TypedMessage{
  140. serial.ToTypedMessage(&dispatcher.Config{}),
  141. serial.ToTypedMessage(&proxyman.InboundConfig{}),
  142. serial.ToTypedMessage(&proxyman.OutboundConfig{}),
  143. },
  144. Outbound: []*core.OutboundHandlerConfig{
  145. {
  146. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  147. },
  148. },
  149. }
  150. cfgBytes, err := proto.Marshal(config)
  151. common.Must(err)
  152. server, err := core.StartInstance("protobuf", cfgBytes)
  153. common.Must(err)
  154. defer server.Close()
  155. conn, err := core.DialUDP(context.Background(), server)
  156. common.Must(err)
  157. defer conn.Close()
  158. const size = 1024
  159. {
  160. payload := make([]byte, size)
  161. common.Must2(rand.Read(payload))
  162. if _, err := conn.WriteTo(payload, &net.UDPAddr{
  163. IP: dest1.Address.IP(),
  164. Port: int(dest1.Port),
  165. }); err != nil {
  166. t.Fatal(err)
  167. }
  168. receive := make([]byte, size)
  169. if _, _, err := conn.ReadFrom(receive); err != nil {
  170. t.Fatal(err)
  171. }
  172. if r := cmp.Diff(xor(receive), payload); r != "" {
  173. t.Error(r)
  174. }
  175. }
  176. {
  177. payload := make([]byte, size)
  178. common.Must2(rand.Read(payload))
  179. if _, err := conn.WriteTo(payload, &net.UDPAddr{
  180. IP: dest2.Address.IP(),
  181. Port: int(dest2.Port),
  182. }); err != nil {
  183. t.Fatal(err)
  184. }
  185. receive := make([]byte, size)
  186. if _, _, err := conn.ReadFrom(receive); err != nil {
  187. t.Fatal(err)
  188. }
  189. if r := cmp.Diff(xor2(receive), payload); r != "" {
  190. t.Error(r)
  191. }
  192. }
  193. }