From 961b4bbb22602b38cf4f617738e798e56fb8b0c5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 8 Jan 2017 22:32:41 +0100 Subject: [PATCH] cleanup socks test --- testing/scenarios/common.go | 2 +- testing/scenarios/data/test_1_client.json | 117 ---------- testing/scenarios/data/test_1_server.json | 46 ---- testing/scenarios/feature_test.go | 83 +++++++ testing/scenarios/socks5_helper.go | 49 ---- testing/scenarios/socks_end_test.go | 261 ---------------------- 6 files changed, 84 insertions(+), 474 deletions(-) delete mode 100644 testing/scenarios/data/test_1_client.json delete mode 100644 testing/scenarios/data/test_1_server.json create mode 100644 testing/scenarios/feature_test.go delete mode 100644 testing/scenarios/socks5_helper.go delete mode 100644 testing/scenarios/socks_end_test.go diff --git a/testing/scenarios/common.go b/testing/scenarios/common.go index fe919f9de..345c0742b 100644 --- a/testing/scenarios/common.go +++ b/testing/scenarios/common.go @@ -12,7 +12,7 @@ import ( ) var ( - port uint32 = 50000 + port uint32 = 40000 ) func pickPort() v2net.Port { diff --git a/testing/scenarios/data/test_1_client.json b/testing/scenarios/data/test_1_client.json deleted file mode 100644 index e7af5c2d4..000000000 --- a/testing/scenarios/data/test_1_client.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "log": { - "loglevel": "debug" - }, - "inbound": { - "port": 50000, - "listen": "127.0.0.1", - "protocol": "socks", - "settings": { - "auth": "noauth", - "udp": true, - "ip": "127.0.0.1" - } - }, - "inboundDetour": [ - { - "port": 50002, - "listen": "127.0.0.1", - "protocol": "socks", - "allowPassive": true, - "settings": { - "auth": "noauth", - "udp": true, - "ip": "127.0.0.1" - } - } - ], - "outbound": { - "protocol": "vmess", - "settings": { - "vnext": [ - { - "address": "127.0.0.1", - "port": 50001, - "users": [ - { - "id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f", - "alterId": 10 - } - ] - } - ] - } - }, - "outboundDetour": [ - { - "protocol": "vmess", - "settings": { - "vnext": [ - { - "address": "127.0.0.1", - "port": 50005, - "users": [ - {"id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f"} - ] - } - ] - } - }, - { - "protocol": "vmess", - "settings": { - "vnext": [ - { - "address": "127.0.0.1", - "port": 50006, - "users": [ - {"id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f"} - ] - } - ] - } - }, - { - "protocol": "vmess", - "settings": { - "vnext": [ - { - "address": "127.0.0.1", - "port": 50007, - "users": [ - {"id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f"} - ] - } - ] - } - }, - { - "protocol": "vmess", - "settings": { - "vnext": [ - { - "address": "127.0.0.1", - "port": 50008, - "users": [ - {"id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f"} - ] - } - ] - } - }, - { - "protocol": "vmess", - "settings": { - "vnext": [ - { - "address": "127.0.0.1", - "port": 50009, - "users": [ - {"id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f"} - ] - } - ] - } - } - ] -} diff --git a/testing/scenarios/data/test_1_server.json b/testing/scenarios/data/test_1_server.json deleted file mode 100644 index 67fedc5e9..000000000 --- a/testing/scenarios/data/test_1_server.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "port": 50001, - "log": { - "loglevel": "debug" - }, - "inbound": { - "listen": "127.0.0.1", - "protocol": "vmess", - "allowPassive": true, - "settings": { - "clients": [ - { - "id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f", - "level": 1, - "alterId": 10 - } - ], - "features": { - "detour": { - "to": "detour" - } - } - } - }, - "outbound": { - "protocol": "freedom", - "settings": {} - }, - "inboundDetour": [ - { - "protocol": "vmess", - "listen": "127.0.0.1", - "port": "50005-50009", - "tag": "detour", - "allowPassive": true, - "settings": { - "clients": [ - { - "id": "d17a1af7-efa5-42ca-b7e9-6a35282d737f", - "level": 1 - } - ] - } - } - ] -} diff --git a/testing/scenarios/feature_test.go b/testing/scenarios/feature_test.go new file mode 100644 index 000000000..f5656e79e --- /dev/null +++ b/testing/scenarios/feature_test.go @@ -0,0 +1,83 @@ +package scenarios + +import ( + "net" + "testing" + + "v2ray.com/core" + v2net "v2ray.com/core/common/net" + "v2ray.com/core/common/serial" + "v2ray.com/core/proxy/dokodemo" + "v2ray.com/core/proxy/freedom" + "v2ray.com/core/testing/assert" + "v2ray.com/core/testing/servers/tcp" +) + +func TestPassiveConnection(t *testing.T) { + assert := assert.On(t) + + tcpServer := tcp.Server{ + MsgProcessor: xor, + SendFirst: []byte("send first"), + } + dest, err := tcpServer.Start() + assert.Error(err).IsNil() + defer tcpServer.Close() + + serverPort := pickPort() + serverConfig := &core.Config{ + Inbound: []*core.InboundConnectionConfig{ + { + PortRange: v2net.SinglePortRange(serverPort), + ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP), + AllowPassiveConnection: true, + Settings: serial.ToTypedMessage(&dokodemo.Config{ + Address: v2net.NewIPOrDomain(dest.Address), + Port: uint32(dest.Port), + NetworkList: &v2net.NetworkList{ + Network: []v2net.Network{v2net.Network_TCP}, + }, + }), + }, + }, + Outbound: []*core.OutboundConnectionConfig{ + { + Settings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + assert.Error(InitializeServerConfig(serverConfig)).IsNil() + + conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ + IP: []byte{127, 0, 0, 1}, + Port: int(serverPort), + }) + assert.Error(err).IsNil() + + { + response := make([]byte, 1024) + nBytes, err := conn.Read(response) + assert.Error(err).IsNil() + assert.String(string(response[:nBytes])).Equals("send first") + } + + payload := "dokodemo request." + { + + nBytes, err := conn.Write([]byte(payload)) + assert.Error(err).IsNil() + assert.Int(nBytes).Equals(len(payload)) + } + + { + response := make([]byte, 1024) + nBytes, err := conn.Read(response) + assert.Error(err).IsNil() + assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) + } + + assert.Error(conn.Close()).IsNil() + + CloseAllServers() +} diff --git a/testing/scenarios/socks5_helper.go b/testing/scenarios/socks5_helper.go deleted file mode 100644 index 5f1ab16af..000000000 --- a/testing/scenarios/socks5_helper.go +++ /dev/null @@ -1,49 +0,0 @@ -package scenarios - -import ( - v2net "v2ray.com/core/common/net" -) - -const ( - socks5Version = byte(0x05) -) - -func socks5AuthMethodRequest(methods ...byte) []byte { - request := []byte{socks5Version, byte(len(methods))} - request = append(request, methods...) - return request -} - -func appendAddress(request []byte, address v2net.Address) []byte { - switch address.Family() { - case v2net.AddressFamilyIPv4: - request = append(request, byte(0x01)) - request = append(request, address.IP()...) - - case v2net.AddressFamilyIPv6: - request = append(request, byte(0x04)) - request = append(request, address.IP()...) - - case v2net.AddressFamilyDomain: - request = append(request, byte(0x03), byte(len(address.Domain()))) - request = append(request, []byte(address.Domain())...) - - } - return request -} - -func socks5Request(command byte, address v2net.Destination) []byte { - request := []byte{socks5Version, command, 0} - request = appendAddress(request, address.Address) - request = address.Port.Bytes(request) - return request -} - -func socks5UDPRequest(address v2net.Destination, payload []byte) []byte { - request := make([]byte, 0, 1024) - request = append(request, 0, 0, 0) - request = appendAddress(request, address.Address) - request = address.Port.Bytes(request) - request = append(request, payload...) - return request -} diff --git a/testing/scenarios/socks_end_test.go b/testing/scenarios/socks_end_test.go deleted file mode 100644 index 23979064c..000000000 --- a/testing/scenarios/socks_end_test.go +++ /dev/null @@ -1,261 +0,0 @@ -package scenarios - -import ( - "net" - "testing" - - v2net "v2ray.com/core/common/net" - "v2ray.com/core/testing/assert" - "v2ray.com/core/testing/servers/tcp" - "v2ray.com/core/testing/servers/udp" -) - -func TestTCPConnection(t *testing.T) { - assert := assert.On(t) - - tcpServer := &tcp.Server{ - 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() - defer tcpServer.Close() - - assert.Error(InitializeServerSetOnce("test_1")).IsNil() - - socksPort := v2net.Port(50000) - - for i := 0; i < 100; i++ { - conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ - IP: []byte{127, 0, 0, 1}, - Port: int(socksPort), - }) - assert.Error(err).IsNil() - - authRequest := socks5AuthMethodRequest(byte(0)) - nBytes, err := conn.Write(authRequest) - assert.Int(nBytes).Equals(len(authRequest)) - assert.Error(err).IsNil() - - authResponse := make([]byte, 1024) - nBytes, err = conn.Read(authResponse) - assert.Error(err).IsNil() - assert.Bytes(authResponse[:nBytes]).Equals([]byte{socks5Version, 0}) - - connectRequest := socks5Request(byte(1), v2net.TCPDestination(v2net.IPAddress([]byte{127, 0, 0, 1}), tcpServer.Port)) - nBytes, err = conn.Write(connectRequest) - assert.Int(nBytes).Equals(len(connectRequest)) - assert.Error(err).IsNil() - - connectResponse := make([]byte, 1024) - nBytes, err = conn.Read(connectResponse) - assert.Error(err).IsNil() - assert.Bytes(connectResponse[:nBytes]).Equals([]byte{socks5Version, 0, 0, 1, 0, 0, 0, 0, 6, 181}) - - actualRequest := []byte("Request to target server.") - nBytes, err = conn.Write(actualRequest) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(actualRequest)) - - actualResponse := make([]byte, 1024) - nResponse, err := conn.Read(actualResponse) - assert.Error(err).IsNil() - - actualRequest = []byte("Request to target server again.") - nBytes, err = conn.Write(actualRequest) - assert.Error(err).IsNil() - assert.Int(nBytes).Equals(len(actualRequest)) - - nBytes, err = conn.Read(actualResponse[nResponse:]) - assert.Error(err).IsNil() - nResponse += nBytes - conn.CloseWrite() - - assert.String(string(actualResponse[:nResponse])).Equals("Processed: Request to target server.Processed: Request to target server again.") - - conn.Close() - } - - CloseAllServers() -} - -func TestPassiveTCPConnection(t *testing.T) { - assert := assert.On(t) - - tcpServer := &tcp.Server{ - MsgProcessor: func(data []byte) []byte { - buffer := make([]byte, 0, 2048) - buffer = append(buffer, []byte("Processed: ")...) - buffer = append(buffer, data...) - return buffer - }, - SendFirst: []byte("Server sends first."), - } - _, err := tcpServer.Start() - assert.Error(err).IsNil() - defer tcpServer.Close() - - assert.Error(InitializeServerSetOnce("test_1")).IsNil() - - socksPort := v2net.Port(50002) - - conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ - IP: []byte{127, 0, 0, 1}, - Port: int(socksPort), - }) - assert.Error(err).IsNil() - - authRequest := socks5AuthMethodRequest(byte(0)) - nBytes, err := conn.Write(authRequest) - assert.Int(nBytes).Equals(len(authRequest)) - assert.Error(err).IsNil() - - authResponse := make([]byte, 1024) - nBytes, err = conn.Read(authResponse) - assert.Error(err).IsNil() - assert.Bytes(authResponse[:nBytes]).Equals([]byte{socks5Version, 0}) - - connectRequest := socks5Request(byte(1), v2net.TCPDestination(v2net.IPAddress([]byte{127, 0, 0, 1}), tcpServer.Port)) - nBytes, err = conn.Write(connectRequest) - assert.Int(nBytes).Equals(len(connectRequest)) - assert.Error(err).IsNil() - - connectResponse := make([]byte, 1024) - nBytes, err = conn.Read(connectResponse) - assert.Error(err).IsNil() - assert.Bytes(connectResponse[:nBytes]).Equals([]byte{socks5Version, 0, 0, 1, 0, 0, 0, 0, 6, 181}) - - actualResponse := make([]byte, 1024) - nResponse, err := conn.Read(actualResponse) - assert.Error(err).IsNil() - - assert.String(string(actualResponse[:nResponse])).Equals(string(tcpServer.SendFirst)) - - conn.Close() - - CloseAllServers() -} - -func TestTCPBind(t *testing.T) { - assert := assert.On(t) - - tcpServer := &tcp.Server{ - 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() - defer tcpServer.Close() - - assert.Error(InitializeServerSetOnce("test_1")).IsNil() - - socksPort := v2net.Port(50000) - - conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ - IP: []byte{127, 0, 0, 1}, - Port: int(socksPort), - }) - - authRequest := socks5AuthMethodRequest(byte(0)) - nBytes, err := conn.Write(authRequest) - assert.Int(nBytes).Equals(len(authRequest)) - assert.Error(err).IsNil() - - authResponse := make([]byte, 1024) - nBytes, err = conn.Read(authResponse) - assert.Error(err).IsNil() - assert.Bytes(authResponse[:nBytes]).Equals([]byte{socks5Version, 0}) - - connectRequest := socks5Request(byte(2), v2net.TCPDestination(v2net.IPAddress([]byte{127, 0, 0, 1}), tcpServer.Port)) - nBytes, err = conn.Write(connectRequest) - assert.Int(nBytes).Equals(len(connectRequest)) - assert.Error(err).IsNil() - - connectResponse := make([]byte, 1024) - nBytes, err = conn.Read(connectResponse) - assert.Error(err).IsNil() - assert.Bytes(connectResponse[:nBytes]).Equals([]byte{socks5Version, 7, 0, 1, 0, 0, 0, 0, 0, 0}) - - conn.Close() - - CloseAllServers() -} - -func TestUDPAssociate(t *testing.T) { - assert := assert.On(t) - - udpServer := &udp.Server{ - 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() - defer udpServer.Close() - - assert.Error(InitializeServerSetOnce("test_1")).IsNil() - - socksPort := v2net.Port(50000) - - conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ - IP: []byte{127, 0, 0, 1}, - Port: int(socksPort), - }) - - authRequest := socks5AuthMethodRequest(byte(0)) - nBytes, err := conn.Write(authRequest) - assert.Int(nBytes).Equals(len(authRequest)) - assert.Error(err).IsNil() - - authResponse := make([]byte, 1024) - nBytes, err = conn.Read(authResponse) - assert.Error(err).IsNil() - assert.Bytes(authResponse[:nBytes]).Equals([]byte{socks5Version, 0}) - - connectRequest := socks5Request(byte(3), v2net.TCPDestination(v2net.LocalHostIP, udpServer.Port)) - nBytes, err = conn.Write(connectRequest) - assert.Int(nBytes).Equals(len(connectRequest)) - assert.Error(err).IsNil() - - connectResponse := make([]byte, 1024) - nBytes, err = conn.Read(connectResponse) - assert.Error(err).IsNil() - assert.Bytes(connectResponse[:nBytes]).Equals([]byte{socks5Version, 0, 0, 1, 127, 0, 0, 1, byte(socksPort >> 8), byte(socksPort)}) - - udpConn, err := net.DialUDP("udp", nil, &net.UDPAddr{ - IP: []byte{127, 0, 0, 1}, - Port: int(socksPort), - }) - assert.Error(err).IsNil() - - for i := 0; i < 100; i++ { - udpPayload := "UDP request to udp server." - udpRequest := socks5UDPRequest(udpServerAddr, []byte(udpPayload)) - - nBytes, err = udpConn.Write(udpRequest) - assert.Int(nBytes).Equals(len(udpRequest)) - assert.Error(err).IsNil() - - udpResponse := make([]byte, 1024) - nBytes, err = udpConn.Read(udpResponse) - assert.Error(err).IsNil() - assert.Bytes(udpResponse[:nBytes]).Equals( - socks5UDPRequest(v2net.UDPDestination(v2net.LocalHostIP, udpServer.Port), []byte("Processed: UDP request to udp server."))) - } - - udpConn.Close() - conn.Close() - - CloseAllServers() -}