unix_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package unixtest
  2. import (
  3. "testing"
  4. "v2ray.com/core"
  5. "v2ray.com/core/app/log"
  6. "v2ray.com/core/app/proxyman"
  7. "v2ray.com/core/common"
  8. clog "v2ray.com/core/common/log"
  9. "v2ray.com/core/common/net"
  10. "v2ray.com/core/common/serial"
  11. "v2ray.com/core/proxy/dokodemo"
  12. "v2ray.com/core/proxy/freedom"
  13. . "v2ray.com/ext/assert"
  14. "v2ray.com/core/testing/servers/tcp"
  15. "v2ray.com/core/testing/scenarios"
  16. "v2ray.com/core/transport/internet/domainsocket"
  17. )
  18. func xor(b []byte) []byte {
  19. r := make([]byte, len(b))
  20. for i, v := range b {
  21. r[i] = v ^ 'c'
  22. }
  23. return r
  24. }
  25. func pickPort() net.Port {
  26. listener, err := net.Listen("tcp4", "127.0.0.1:0")
  27. common.Must(err)
  28. defer listener.Close()
  29. addr := listener.Addr().(*net.TCPAddr)
  30. return net.Port(addr.Port)
  31. }
  32. func TestUnix2tcpS(t *testing.T) {
  33. assert := With(t)
  34. tcpServer := tcp.Server{
  35. MsgProcessor: xor,
  36. }
  37. dest, err := tcpServer.Start()
  38. assert(err, IsNil)
  39. defer tcpServer.Close()
  40. Server := &core.Config{
  41. App: []*serial.TypedMessage{
  42. serial.ToTypedMessage(&log.Config{
  43. ErrorLogLevel: clog.Severity_Debug,
  44. ErrorLogType: log.LogType_Console,
  45. }),
  46. },
  47. Inbound: []*core.InboundHandlerConfig{
  48. {
  49. ReceiverSettings: serial.ToTypedMessage(&proxyman.UnixReceiverConfig{
  50. DomainSockSettings: &domainsocket.DomainSocketSettings{Path: "\x00v2raytest"},
  51. }),
  52. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  53. Address: net.NewIPOrDomain(dest.Address),
  54. Port: uint32(dest.Port),
  55. NetworkList: &net.NetworkList{
  56. Network: []net.Network{net.Network_TCP},
  57. },
  58. }),
  59. },
  60. },
  61. Outbound: []*core.OutboundHandlerConfig{
  62. {ProxySettings: serial.ToTypedMessage(&freedom.Config{})},
  63. },
  64. }
  65. serverPort := pickPort()
  66. Client := &core.Config{
  67. App: []*serial.TypedMessage{
  68. serial.ToTypedMessage(&log.Config{
  69. ErrorLogLevel: clog.Severity_Debug,
  70. ErrorLogType: log.LogType_Console,
  71. }),
  72. },
  73. Outbound: []*core.OutboundHandlerConfig{
  74. {
  75. SenderSettings: serial.ToTypedMessage(&proxyman.UnixSenderConfig{
  76. DomainSockSettings: &domainsocket.DomainSocketSettings{Path: "\x00v2raytest"},
  77. }),
  78. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  79. },
  80. },
  81. Inbound: []*core.InboundHandlerConfig{
  82. {ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  83. Address: net.NewIPOrDomain(dest.Address),
  84. Port: uint32(dest.Port),
  85. NetworkList: &net.NetworkList{
  86. Network: []net.Network{net.Network_TCP},
  87. },
  88. }),
  89. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  90. PortRange: net.SinglePortRange(serverPort),
  91. Listen: net.NewIPOrDomain(net.LocalHostIP),
  92. }),
  93. },
  94. },
  95. }
  96. servers, err := scenarios.InitializeServerConfigs(Server, Client)
  97. port := serverPort
  98. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  99. IP: []byte{127, 0, 0, 1},
  100. Port: int(port),
  101. })
  102. assert(err, IsNil)
  103. payload := "dokodemo request."
  104. nBytes, err := conn.Write([]byte(payload))
  105. assert(err, IsNil)
  106. assert(nBytes, Equals, len(payload))
  107. response := make([]byte, 1024)
  108. nBytes, err = conn.Read(response)
  109. assert(err, IsNil)
  110. assert(response[:nBytes], Equals, xor([]byte(payload)))
  111. assert(conn.Close(), IsNil)
  112. scenarios.CloseAllServers(servers)
  113. }