func TestDokodemoUDP(t *testing.T) { assert := unit.Assert(t) port := v2nettesting.PickPort() data2Send := "Data to be sent to remote." udpServer := &udp.Server{ Port: port, MsgProcessor: func(data []byte) []byte { buffer := make([]byte, 0, 2048) buffer = append(buffer, []byte("Processed: ")...) buffer = append(buffer, data...) return buffer }, } _, err := udpServer.Start() assert.Error(err).IsNil() pointPort := v2nettesting.PickPort() networkList := v2netjson.NetworkList([]string{"udp"}) config := mocks.Config{ PortValue: pointPort, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "dokodemo-door", SettingsValue: &json.DokodemoConfig{ Host: "127.0.0.1", Port: int(port), Network: &networkList, Timeout: 0, }, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "freedom", SettingsValue: nil, }, } point, err := point.NewPoint(&config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() udpClient, err := net.DialUDP("udp", nil, &net.UDPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(pointPort), Zone: "", }) assert.Error(err).IsNil() udpClient.Write([]byte(data2Send)) response := make([]byte, 1024) nBytes, err := udpClient.Read(response) assert.Error(err).IsNil() udpClient.Close() assert.String("Processed: " + data2Send).Equals(string(response[:nBytes])) }
func TestSocksUdpSend(t *testing.T) { v2testing.Current(t) port := v2nettesting.PickPort() connInput := []byte("The data to be returned to socks server.") connOutput := bytes.NewBuffer(make([]byte, 0, 1024)) och := &proxymocks.OutboundConnectionHandler{ ConnInput: bytes.NewReader(connInput), ConnOutput: connOutput, } protocol, err := proxytesting.RegisterOutboundConnectionHandlerCreator("mock_och", func(space app.Space, config interface{}) (v2proxy.OutboundConnectionHandler, error) { return och, nil }) assert.Error(err).IsNil() config := &point.Config{ Port: port, InboundConfig: &point.ConnectionConfig{ Protocol: "socks", Settings: []byte(`{"auth": "noauth", "udp": true}`), }, OutboundConfig: &point.ConnectionConfig{ Protocol: protocol, Settings: nil, }, } point, err := point.NewPoint(config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(port), Zone: "", }) assert.Error(err).IsNil() data2Send := []byte("Fake DNS request") buffer := make([]byte, 0, 1024) buffer = append(buffer, 0, 0, 0) buffer = append(buffer, 1, 8, 8, 4, 4, 0, 53) buffer = append(buffer, data2Send...) conn.Write(buffer) response := make([]byte, 1024) nBytes, err := conn.Read(response) assert.Error(err).IsNil() assert.Bytes(response[10:nBytes]).Equals(connInput) assert.Bytes(data2Send).Equals(connOutput.Bytes()) assert.StringLiteral(och.Destination.String()).Equals("udp:8.8.4.4:53") }
func TestDokodemoTCP(t *testing.T) { v2testing.Current(t) port := v2nettesting.PickPort() data2Send := "Data to be sent to remote." tcpServer := &tcp.Server{ Port: port, MsgProcessor: func(data []byte) []byte { buffer := make([]byte, 0, 2048) buffer = append(buffer, []byte("Processed: ")...) buffer = append(buffer, data...) return buffer }, } _, err := tcpServer.Start() assert.Error(err).IsNil() pointPort := v2nettesting.PickPort() config := mocks.Config{ PortValue: pointPort, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "dokodemo-door", SettingsValue: []byte(`{ "address": "127.0.0.1", "port": ` + port.String() + `, "network": "tcp", "timeout": 0 }`), }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "freedom", SettingsValue: nil, }, } point, err := point.NewPoint(&config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() tcpClient, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(pointPort), Zone: "", }) assert.Error(err).IsNil() tcpClient.Write([]byte(data2Send)) tcpClient.CloseWrite() response := make([]byte, 1024) nBytes, err := tcpClient.Read(response) assert.Error(err).IsNil() tcpClient.Close() assert.StringLiteral("Processed: " + data2Send).Equals(string(response[:nBytes])) }
func main() { flag.Parse() core.PrintVersion() if *version { return } switch *logLevel { case "debug": log.SetLogLevel(log.DebugLevel) case "info": log.SetLogLevel(log.InfoLevel) case "warning": log.SetLogLevel(log.WarningLevel) case "error": log.SetLogLevel(log.ErrorLevel) default: fmt.Println("Unknown log level: " + *logLevel) return } if len(configFile) == 0 { log.Error("Config file is not set.") return } config, err := point.LoadConfig(configFile) if err != nil { log.Error("Failed to read config file (", configFile, "): ", configFile, err) return } if config.LogConfig != nil && len(config.LogConfig.AccessLog) > 0 { log.InitAccessLogger(config.LogConfig.AccessLog) } vPoint, err := point.NewPoint(config) if err != nil { log.Error("Failed to create Point server: ", err) return } if *test { fmt.Println("Configuration OK.") return } err = vPoint.Start() if err != nil { log.Error("Error starting Point server: ", err) return } osSignals := make(chan os.Signal, 1) signal.Notify(osSignals, os.Interrupt, os.Kill) <-osSignals vPoint.Close() }
func TestSocksUdpSend(t *testing.T) { v2testing.Current(t) port := v2nettesting.PickPort() connInput := []byte("The data to be returned to socks server.") connOutput := bytes.NewBuffer(make([]byte, 0, 1024)) och := &proxymocks.OutboundConnectionHandler{ ConnInput: bytes.NewReader(connInput), ConnOutput: connOutput, } connhandler.RegisterOutboundConnectionHandlerFactory("mock_och", och) config := mocks.Config{ PortValue: port, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "socks", SettingsValue: &json.SocksConfig{ AuthMethod: "noauth", UDP: true, }, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "mock_och", SettingsValue: nil, }, } point, err := point.NewPoint(&config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(port), Zone: "", }) assert.Error(err).IsNil() data2Send := []byte("Fake DNS request") buffer := make([]byte, 0, 1024) buffer = append(buffer, 0, 0, 0) buffer = append(buffer, 1, 8, 8, 4, 4, 0, 53) buffer = append(buffer, data2Send...) conn.Write(buffer) response := make([]byte, 1024) nBytes, err := conn.Read(response) assert.Error(err).IsNil() assert.Bytes(response[10:nBytes]).Equals(connInput) assert.Bytes(data2Send).Equals(connOutput.Bytes()) assert.StringLiteral(och.Destination.String()).Equals("udp:8.8.4.4:53") }
func TestSocksTcpConnect(t *testing.T) { v2testing.Current(t) port := v2nettesting.PickPort() connInput := []byte("The data to be returned to socks server.") connOutput := bytes.NewBuffer(make([]byte, 0, 1024)) och := &proxymocks.OutboundConnectionHandler{ ConnOutput: connOutput, ConnInput: bytes.NewReader(connInput), } protocol, err := proxytesting.RegisterOutboundConnectionHandlerCreator("mock_och", func(space app.Space, config interface{}) (v2proxy.OutboundConnectionHandler, error) { return och, nil }) assert.Error(err).IsNil() config := mocks.Config{ PortValue: port, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "socks", SettingsValue: []byte(` { "auth": "noauth" }`), }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: protocol, SettingsValue: nil, }, } point, err := point.NewPoint(&config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() socks5Client, err := proxy.SOCKS5("tcp", fmt.Sprintf("127.0.0.1:%d", port), nil, proxy.Direct) assert.Error(err).IsNil() targetServer := "google.com:80" conn, err := socks5Client.Dial("tcp", targetServer) assert.Error(err).IsNil() data2Send := "The data to be sent to remote server." conn.Write([]byte(data2Send)) if tcpConn, ok := conn.(*net.TCPConn); ok { tcpConn.CloseWrite() } dataReturned, err := ioutil.ReadAll(conn) assert.Error(err).IsNil() conn.Close() assert.Bytes([]byte(data2Send)).Equals(connOutput.Bytes()) assert.Bytes(dataReturned).Equals(connInput) assert.StringLiteral(targetServer).Equals(och.Destination.NetAddr()) }
func TestSocksTcpConnect(t *testing.T) { v2testing.Current(t) port := v2nettesting.PickPort() data2Send := "Data to be sent to remote" tcpServer := &tcp.Server{ Port: port, MsgProcessor: func(data []byte) []byte { buffer := make([]byte, 0, 2048) buffer = append(buffer, []byte("Processed: ")...) buffer = append(buffer, data...) return buffer }, } _, err := tcpServer.Start() assert.Error(err).IsNil() pointPort := v2nettesting.PickPort() config := mocks.Config{ PortValue: pointPort, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "socks", SettingsValue: &json.SocksConfig{ AuthMethod: "auth", }, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "freedom", SettingsValue: nil, }, } point, err := point.NewPoint(&config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() socks5Client, err := proxy.SOCKS5("tcp", fmt.Sprintf("127.0.0.1:%d", pointPort), nil, proxy.Direct) assert.Error(err).IsNil() targetServer := fmt.Sprintf("127.0.0.1:%d", port) conn, err := socks5Client.Dial("tcp", targetServer) assert.Error(err).IsNil() conn.Write([]byte(data2Send)) if tcpConn, ok := conn.(*net.TCPConn); ok { tcpConn.CloseWrite() } dataReturned, err := v2net.ReadFrom(conn, nil) assert.Error(err).IsNil() conn.Close() assert.Bytes(dataReturned.Value).Equals([]byte("Processed: Data to be sent to remote")) }
func TestSocksTcpConnectWithUserPass(t *testing.T) { v2testing.Current(t) port := v2nettesting.PickPort() connInput := []byte("The data to be returned to socks server.") connOutput := bytes.NewBuffer(make([]byte, 0, 1024)) och := &proxymocks.OutboundConnectionHandler{ ConnInput: bytes.NewReader(connInput), ConnOutput: connOutput, } connhandler.RegisterOutboundConnectionHandlerFactory("mock_och", och) config := mocks.Config{ PortValue: port, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "socks", SettingsValue: &json.SocksConfig{ AuthMethod: "password", Accounts: json.SocksAccountMap{ "userx": "passy", }, }, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "mock_och", SettingsValue: nil, }, } point, err := point.NewPoint(&config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() socks5Client, err := proxy.SOCKS5("tcp", fmt.Sprintf("127.0.0.1:%d", port), &proxy.Auth{"userx", "passy"}, proxy.Direct) assert.Error(err).IsNil() targetServer := "1.2.3.4:443" conn, err := socks5Client.Dial("tcp", targetServer) assert.Error(err).IsNil() data2Send := "The data to be sent to remote server." conn.Write([]byte(data2Send)) if tcpConn, ok := conn.(*net.TCPConn); ok { tcpConn.CloseWrite() } dataReturned, err := ioutil.ReadAll(conn) assert.Error(err).IsNil() conn.Close() assert.Bytes([]byte(data2Send)).Equals(connOutput.Bytes()) assert.Bytes(dataReturned).Equals(connInput) assert.StringLiteral(targetServer).Equals(och.Destination.NetAddr()) }
func TestUDPSend(t *testing.T) { v2testing.Current(t) data2Send := "Data to be sent to remote" udpServer := &udp.Server{ Port: 0, MsgProcessor: func(data []byte) []byte { buffer := make([]byte, 0, 2048) buffer = append(buffer, []byte("Processed: ")...) buffer = append(buffer, data...) return buffer }, } udpServerAddr, err := udpServer.Start() assert.Error(err).IsNil() connOutput := bytes.NewBuffer(make([]byte, 0, 1024)) ich := &proxymocks.InboundConnectionHandler{ ConnInput: bytes.NewReader([]byte("Not Used")), ConnOutput: connOutput, } protocol, err := proxytesting.RegisterInboundConnectionHandlerCreator("mock_ich", func(space app.Space, config interface{}) (v2proxy.InboundHandler, error) { ich.Space = space return ich, nil }) assert.Error(err).IsNil() pointPort := v2nettesting.PickPort() config := &point.Config{ Port: pointPort, InboundConfig: &point.ConnectionConfig{ Protocol: protocol, Settings: nil, }, OutboundConfig: &point.ConnectionConfig{ Protocol: "freedom", Settings: nil, }, } point, err := point.NewPoint(config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() data2SendBuffer := alloc.NewBuffer().Clear() data2SendBuffer.Append([]byte(data2Send)) ich.Communicate(v2net.NewPacket(udpServerAddr, data2SendBuffer, false)) assert.Bytes(connOutput.Bytes()).Equals([]byte("Processed: Data to be sent to remote")) }
func main() { flag.Parse() core.PrintVersion() if *version { return } switch *logLevel { case "debug": log.SetLogLevel(log.DebugLevel) case "info": log.SetLogLevel(log.InfoLevel) case "warning": log.SetLogLevel(log.WarningLevel) case "error": log.SetLogLevel(log.ErrorLevel) default: fmt.Println("Unknown log level: " + *logLevel) return } if len(configFile) == 0 { log.Error("Config file is not set.") return } config, err := point.LoadConfig(configFile) if err != nil { log.Error("Failed to read config file (", configFile, "): ", configFile, err) return } vPoint, err := point.NewPoint(config) if err != nil { log.Error("Failed to create Point server: ", err) return } if *test { fmt.Println("Configuration OK.") return } err = vPoint.Start() if err != nil { log.Error("Error starting Point server: ", err) return } finish := make(chan bool) <-finish }
func TestUDPSend(t *testing.T) { assert := unit.Assert(t) data2Send := "Data to be sent to remote" udpServer := &udp.Server{ Port: 0, MsgProcessor: func(data []byte) []byte { buffer := make([]byte, 0, 2048) buffer = append(buffer, []byte("Processed: ")...) buffer = append(buffer, data...) return buffer }, } udpServerAddr, err := udpServer.Start() assert.Error(err).IsNil() connOutput := bytes.NewBuffer(make([]byte, 0, 1024)) ich := &proxymocks.InboundConnectionHandler{ ConnInput: bytes.NewReader([]byte("Not Used")), ConnOutput: connOutput, } connhandler.RegisterInboundConnectionHandlerFactory("mock_ich", ich) pointPort := v2nettesting.PickPort() config := mocks.Config{ PortValue: pointPort, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "mock_ich", SettingsValue: nil, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "freedom", SettingsValue: nil, }, } point, err := point.NewPoint(&config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() data2SendBuffer := alloc.NewBuffer().Clear() data2SendBuffer.Append([]byte(data2Send)) dest := v2net.NewUDPDestination(udpServerAddr) ich.Communicate(v2net.NewPacket(dest, data2SendBuffer, false)) assert.Bytes(connOutput.Bytes()).Equals([]byte("Processed: Data to be sent to remote")) }
func startV2Ray() *point.Point { switch *logLevel { case "debug": log.SetLogLevel(log.DebugLevel) case "info": log.SetLogLevel(log.InfoLevel) case "warning": log.SetLogLevel(log.WarningLevel) case "error": log.SetLogLevel(log.ErrorLevel) default: fmt.Println("Unknown log level: " + *logLevel) return nil } if len(configFile) == 0 { log.Error("Config file is not set.") return nil } config, err := point.LoadConfig(configFile) if err != nil { log.Error("Failed to read config file (", configFile, "): ", configFile, err) return nil } if config.LogConfig != nil && len(config.LogConfig.AccessLog) > 0 { log.InitAccessLogger(config.LogConfig.AccessLog) } vPoint, err := point.NewPoint(config) if err != nil { log.Error("Failed to create Point server: ", err) return nil } if *test { fmt.Println("Configuration OK.") return nil } err = vPoint.Start() if err != nil { log.Error("Error starting Point server: ", err) return nil } return vPoint }
func TestSocksTcpConnectWithWrongAuthMethod(t *testing.T) { v2testing.Current(t) port := v2nettesting.PickPort() connInput := []byte("The data to be returned to socks server.") connOutput := bytes.NewBuffer(make([]byte, 0, 1024)) och := &proxymocks.OutboundConnectionHandler{ ConnInput: bytes.NewReader(connInput), ConnOutput: connOutput, } protocol, err := proxytesting.RegisterOutboundConnectionHandlerCreator("mock_och", func(space app.Space, config interface{}) (v2proxy.OutboundConnectionHandler, error) { return och, nil }) assert.Error(err).IsNil() config := mocks.Config{ PortValue: port, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "socks", SettingsValue: []byte(` { "auth": "password", "accounts": [ {"user": "******", "pass": "******"} ] }`), }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: protocol, SettingsValue: nil, }, } point, err := point.NewPoint(&config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() socks5Client, err := proxy.SOCKS5("tcp", fmt.Sprintf("127.0.0.1:%d", port), nil, proxy.Direct) assert.Error(err).IsNil() targetServer := "1.2.3.4:443" _, err = socks5Client.Dial("tcp", targetServer) assert.Error(err).IsNotNil() }
func TestSocksTcpConnectWithWrongAuthMethod(t *testing.T) { v2testing.Current(t) port := v2nettesting.PickPort() connInput := []byte("The data to be returned to socks server.") connOutput := bytes.NewBuffer(make([]byte, 0, 1024)) och := &proxymocks.OutboundConnectionHandler{ ConnInput: bytes.NewReader(connInput), ConnOutput: connOutput, } connhandler.RegisterOutboundConnectionHandlerFactory("mock_och", och) config := mocks.Config{ PortValue: port, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "socks", SettingsValue: &json.SocksConfig{ AuthMethod: "password", Accounts: json.SocksAccountMap{ "userx": "passy", }, }, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "mock_och", SettingsValue: nil, }, } point, err := point.NewPoint(&config) assert.Error(err).IsNil() err = point.Start() assert.Error(err).IsNil() socks5Client, err := proxy.SOCKS5("tcp", fmt.Sprintf("127.0.0.1:%d", port), nil, proxy.Direct) assert.Error(err).IsNil() targetServer := "1.2.3.4:443" _, err = socks5Client.Dial("tcp", targetServer) assert.Error(err).IsNotNil() }
func InitializeServer(configFile string) error { config, err := pointjson.LoadConfig(configFile) if err != nil { log.Error("Failed to read config file (%s): %v", configFile, err) return err } vPoint, err := point.NewPoint(config) if err != nil { log.Error("Failed to create Point server: %v", err) return err } err = vPoint.Start() if err != nil { log.Error("Error starting Point server: %v", err) return err } return nil }
func InitializeServer(configFile string) error { config, err := point.LoadConfig(configFile) if err != nil { log.Error("Failed to read config file (", configFile, "): ", configFile, err) return err } vPoint, err := point.NewPoint(config) if err != nil { log.Error("Failed to create Point server: ", err) return err } err = vPoint.Start() if err != nil { log.Error("Error starting Point server: ", err) return err } runningServers = append(runningServers, vPoint) return nil }
func TestVMessInAndOut(t *testing.T) { v2testing.Current(t) id, err := uuid.ParseString("ad937d9d-6e23-4a5a-ba23-bce5092a7c51") assert.Error(err).IsNil() testAccount := vmess.NewID(id) portA := v2nettesting.PickPort() portB := v2nettesting.PickPort() ichConnInput := []byte("The data to be send to outbound server.") ichConnOutput := bytes.NewBuffer(make([]byte, 0, 1024)) ich := &proxymocks.InboundConnectionHandler{ ConnInput: bytes.NewReader(ichConnInput), ConnOutput: ichConnOutput, } protocol, err := proxytesting.RegisterInboundConnectionHandlerCreator("mock_och", func(space app.Space, config interface{}) (proxy.InboundHandler, error) { ich.Space = space return ich, nil }) assert.Error(err).IsNil() configA := &point.Config{ Port: portA, InboundConfig: &point.ConnectionConfig{ Protocol: protocol, Settings: nil, }, OutboundConfig: &point.ConnectionConfig{ Protocol: "vmess", Settings: []byte(`{ "vnext": [ { "address": "127.0.0.1", "port": ` + portB.String() + `, "users": [ {"id": "` + testAccount.String() + `"} ] } ] }`), }, } pointA, err := point.NewPoint(configA) assert.Error(err).IsNil() err = pointA.Start() assert.Error(err).IsNil() ochConnInput := []byte("The data to be returned to inbound server.") ochConnOutput := bytes.NewBuffer(make([]byte, 0, 1024)) och := &proxymocks.OutboundConnectionHandler{ ConnInput: bytes.NewReader(ochConnInput), ConnOutput: ochConnOutput, } protocol, err = proxytesting.RegisterOutboundConnectionHandlerCreator("mock_och", func(space app.Space, config interface{}) (proxy.OutboundHandler, error) { return och, nil }) assert.Error(err).IsNil() configB := &point.Config{ Port: portB, InboundConfig: &point.ConnectionConfig{ Protocol: "vmess", Settings: []byte(`{ "clients": [ {"id": "` + testAccount.String() + `"} ] }`), }, OutboundConfig: &point.ConnectionConfig{ Protocol: protocol, Settings: nil, }, } pointB, err := point.NewPoint(configB) assert.Error(err).IsNil() err = pointB.Start() assert.Error(err).IsNil() dest := v2net.TCPDestination(v2net.IPAddress([]byte{1, 2, 3, 4}), 80) ich.Communicate(v2net.NewPacket(dest, nil, true)) assert.Bytes(ichConnInput).Equals(ochConnOutput.Bytes()) assert.Bytes(ichConnOutput.Bytes()).Equals(ochConnInput) }
func setUpV2Ray() (uint16, error) { id1, err := config.NewID("ad937d9d-6e23-4a5a-ba23-bce5092a7c51") if err != nil { return 0, err } id2, err := config.NewID("93ccfc71-b136-4015-ac85-e037bd1ead9e") if err != nil { return 0, err } users := []*vmessjson.ConfigUser{ &vmessjson.ConfigUser{Id: id1}, &vmessjson.ConfigUser{Id: id2}, } portB := v2nettesting.PickPort() configB := mocks.Config{ PortValue: portB, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "vmess", SettingsValue: &vmessjson.Inbound{ AllowedClients: users, }, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "freedom", SettingsValue: nil, }, } pointB, err := point.NewPoint(&configB) if err != nil { return 0, err } err = pointB.Start() if err != nil { return 0, err } portA := v2nettesting.PickPort() configA := mocks.Config{ PortValue: portA, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "socks", SettingsValue: &socksjson.SocksConfig{ AuthMethod: "noauth", UDPEnabled: true, HostIP: socksjson.IPAddress(net.IPv4(127, 0, 0, 1)), }, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "vmess", SettingsValue: &vmessjson.Outbound{ []*vmessjson.ConfigTarget{ &vmessjson.ConfigTarget{ Address: v2net.IPAddress([]byte{127, 0, 0, 1}, portB), Users: users, }, }, }, }, } pointA, err := point.NewPoint(&configA) if err != nil { return 0, err } err = pointA.Start() if err != nil { return 0, err } return portA, nil }
func TestVMessInAndOut(t *testing.T) { v2testing.Current(t) id, err := uuid.ParseString("ad937d9d-6e23-4a5a-ba23-bce5092a7c51") assert.Error(err).IsNil() testAccount := vmess.NewID(id) portA := v2nettesting.PickPort() portB := v2nettesting.PickPort() ichConnInput := []byte("The data to be send to outbound server.") ichConnOutput := bytes.NewBuffer(make([]byte, 0, 1024)) ich := &proxymocks.InboundConnectionHandler{ ConnInput: bytes.NewReader(ichConnInput), ConnOutput: ichConnOutput, } connhandler.RegisterInboundConnectionHandlerFactory("mock_ich", ich) configA := mocks.Config{ PortValue: portA, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "mock_ich", SettingsValue: nil, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "vmess", SettingsValue: &outboundjson.Outbound{ []*outboundjson.ConfigTarget{ &outboundjson.ConfigTarget{ Destination: v2net.TCPDestination(v2net.IPAddress([]byte{127, 0, 0, 1}), portB), Users: []*vmessjson.ConfigUser{ &vmessjson.ConfigUser{Id: testAccount}, }, }, }, }, }, } pointA, err := point.NewPoint(&configA) assert.Error(err).IsNil() err = pointA.Start() assert.Error(err).IsNil() ochConnInput := []byte("The data to be returned to inbound server.") ochConnOutput := bytes.NewBuffer(make([]byte, 0, 1024)) och := &proxymocks.OutboundConnectionHandler{ ConnInput: bytes.NewReader(ochConnInput), ConnOutput: ochConnOutput, } connhandler.RegisterOutboundConnectionHandlerFactory("mock_och", och) configB := mocks.Config{ PortValue: portB, InboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "vmess", SettingsValue: &inboundjson.Inbound{ AllowedClients: []*vmessjson.ConfigUser{ &vmessjson.ConfigUser{Id: testAccount}, }, }, }, OutboundConfigValue: &mocks.ConnectionConfig{ ProtocolValue: "mock_och", SettingsValue: nil, }, } pointB, err := point.NewPoint(&configB) assert.Error(err).IsNil() err = pointB.Start() assert.Error(err).IsNil() dest := v2net.TCPDestination(v2net.IPAddress([]byte{1, 2, 3, 4}), 80) ich.Communicate(v2net.NewPacket(dest, nil, true)) assert.Bytes(ichConnInput).Equals(ochConnOutput.Bytes()) assert.Bytes(ichConnOutput.Bytes()).Equals(ochConnInput) }