functions_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package core_test
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "io"
  6. "testing"
  7. "github.com/golang/protobuf/proto"
  8. "github.com/google/go-cmp/cmp"
  9. "v2ray.com/core"
  10. "v2ray.com/core/app/dispatcher"
  11. "v2ray.com/core/app/proxyman"
  12. "v2ray.com/core/common"
  13. "v2ray.com/core/common/net"
  14. "v2ray.com/core/common/serial"
  15. "v2ray.com/core/proxy/freedom"
  16. "v2ray.com/core/testing/servers/tcp"
  17. "v2ray.com/core/testing/servers/udp"
  18. )
  19. func xor(b []byte) []byte {
  20. r := make([]byte, len(b))
  21. for i, v := range b {
  22. r[i] = v ^ 'c'
  23. }
  24. return r
  25. }
  26. func xor2(b []byte) []byte {
  27. r := make([]byte, len(b))
  28. for i, v := range b {
  29. r[i] = v ^ 'd'
  30. }
  31. return r
  32. }
  33. func TestV2RayDial(t *testing.T) {
  34. tcpServer := tcp.Server{
  35. MsgProcessor: xor,
  36. }
  37. dest, err := tcpServer.Start()
  38. common.Must(err)
  39. defer tcpServer.Close()
  40. config := &core.Config{
  41. App: []*serial.TypedMessage{
  42. serial.ToTypedMessage(&dispatcher.Config{}),
  43. serial.ToTypedMessage(&proxyman.InboundConfig{}),
  44. serial.ToTypedMessage(&proxyman.OutboundConfig{}),
  45. },
  46. Outbound: []*core.OutboundHandlerConfig{
  47. {
  48. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  49. },
  50. },
  51. }
  52. cfgBytes, err := proto.Marshal(config)
  53. common.Must(err)
  54. server, err := core.StartInstance("protobuf", cfgBytes)
  55. common.Must(err)
  56. defer server.Close()
  57. conn, err := core.Dial(context.Background(), server, dest)
  58. common.Must(err)
  59. defer conn.Close()
  60. const size = 10240 * 1024
  61. payload := make([]byte, size)
  62. common.Must2(rand.Read(payload))
  63. if _, err := conn.Write(payload); err != nil {
  64. t.Fatal(err)
  65. }
  66. receive := make([]byte, size)
  67. if _, err := io.ReadFull(conn, receive); err != nil {
  68. t.Fatal("failed to read all response: ", err)
  69. }
  70. if r := cmp.Diff(xor(receive), payload); r != "" {
  71. t.Error(r)
  72. }
  73. }
  74. func TestV2RayDialUDP(t *testing.T) {
  75. udpServer1 := udp.Server{
  76. MsgProcessor: xor,
  77. }
  78. dest1, err := udpServer1.Start()
  79. common.Must(err)
  80. defer udpServer1.Close()
  81. udpServer2 := udp.Server{
  82. MsgProcessor: xor2,
  83. }
  84. dest2, err := udpServer2.Start()
  85. common.Must(err)
  86. defer udpServer2.Close()
  87. config := &core.Config{
  88. App: []*serial.TypedMessage{
  89. serial.ToTypedMessage(&dispatcher.Config{}),
  90. serial.ToTypedMessage(&proxyman.InboundConfig{}),
  91. serial.ToTypedMessage(&proxyman.OutboundConfig{}),
  92. },
  93. Outbound: []*core.OutboundHandlerConfig{
  94. {
  95. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  96. },
  97. },
  98. }
  99. cfgBytes, err := proto.Marshal(config)
  100. common.Must(err)
  101. server, err := core.StartInstance("protobuf", cfgBytes)
  102. common.Must(err)
  103. defer server.Close()
  104. conn, err := core.DialUDP(context.Background(), server)
  105. common.Must(err)
  106. defer conn.Close()
  107. const size = 1024
  108. {
  109. payload := make([]byte, size)
  110. common.Must2(rand.Read(payload))
  111. if _, err := conn.WriteTo(payload, &net.UDPAddr{
  112. IP: dest1.Address.IP(),
  113. Port: int(dest1.Port),
  114. }); err != nil {
  115. t.Fatal(err)
  116. }
  117. receive := make([]byte, size)
  118. if _, _, err := conn.ReadFrom(receive); err != nil {
  119. t.Fatal(err)
  120. }
  121. if r := cmp.Diff(xor(receive), payload); r != "" {
  122. t.Error(r)
  123. }
  124. }
  125. {
  126. payload := make([]byte, size)
  127. common.Must2(rand.Read(payload))
  128. if _, err := conn.WriteTo(payload, &net.UDPAddr{
  129. IP: dest2.Address.IP(),
  130. Port: int(dest2.Port),
  131. }); err != nil {
  132. t.Fatal(err)
  133. }
  134. receive := make([]byte, size)
  135. if _, _, err := conn.ReadFrom(receive); err != nil {
  136. t.Fatal(err)
  137. }
  138. if r := cmp.Diff(xor2(receive), payload); r != "" {
  139. t.Error(r)
  140. }
  141. }
  142. }