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 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 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 TestVMessSerialization(t *testing.T) { v2testing.Current(t) id, err := uuid.ParseString("2b2966ac-16aa-4fbf-8d81-c5f172a3da51") assert.Error(err).IsNil() userId := vmess.NewID(id) testUser := &vmess.User{ ID: userId, } userSet := protocoltesting.MockUserSet{[]*vmess.User{}, make(map[string]int), make(map[string]Timestamp)} userSet.AddUser(testUser) request := new(VMessRequest) request.Version = byte(0x01) request.User = testUser randBytes := make([]byte, 36) _, err = rand.Read(randBytes) assert.Error(err).IsNil() request.RequestIV = randBytes[:16] request.RequestKey = randBytes[16:32] request.ResponseHeader = randBytes[32:] request.Command = byte(0x01) request.Address = v2net.DomainAddress("v2ray.com") request.Port = v2net.Port(80) mockTime := Timestamp(1823730) buffer, err := request.ToBytes(&FakeTimestampGenerator{timestamp: mockTime}, nil) if err != nil { t.Fatal(err) } userSet.UserHashes[string(buffer.Value[:16])] = 0 userSet.Timestamps[string(buffer.Value[:16])] = mockTime requestReader := NewVMessRequestReader(&userSet) actualRequest, err := requestReader.Read(bytes.NewReader(buffer.Value)) if err != nil { t.Fatal(err) } assert.Byte(actualRequest.Version).Named("Version").Equals(byte(0x01)) assert.String(actualRequest.User.ID).Named("UserId").Equals(request.User.ID.String()) assert.Bytes(actualRequest.RequestIV).Named("RequestIV").Equals(request.RequestIV[:]) assert.Bytes(actualRequest.RequestKey).Named("RequestKey").Equals(request.RequestKey[:]) assert.Bytes(actualRequest.ResponseHeader).Named("ResponseHeader").Equals(request.ResponseHeader[:]) assert.Byte(actualRequest.Command).Named("Command").Equals(request.Command) assert.String(actualRequest.Address).Named("Address").Equals(request.Address.String()) }
func TestAuthenticate(t *testing.T) { v2testing.Current(t) buffer := alloc.NewBuffer().Clear() buffer.AppendBytes(1, 2, 3, 4) Authenticate(buffer) assert.Bytes(buffer.Value).Equals([]byte{0, 8, 87, 52, 168, 125, 1, 2, 3, 4}) b2, err := NewAuthChunkReader(buffer).Read() assert.Error(err).IsNil() assert.Bytes(b2.Value).Equals([]byte{1, 2, 3, 4}) }
func TestNormalChunkReading(t *testing.T) { assert := assert.On(t) buffer := alloc.NewBuffer().Clear().AppendBytes( 0, 8, 39, 228, 69, 96, 133, 39, 254, 26, 201, 70, 11, 12, 13, 14, 15, 16, 17, 18) reader := NewChunkReader(buffer, NewAuthenticator(ChunkKeyGenerator( []byte{21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}))) payload, err := reader.Read() assert.Error(err).IsNil() assert.Bytes(payload.Value).Equals([]byte{11, 12, 13, 14, 15, 16, 17, 18}) payload.PrependBytes(3, 4) assert.Bytes(payload.Value).Equals([]byte{3, 4, 11, 12, 13, 14, 15, 16, 17, 18}) }
func TestTCPBind(t *testing.T) { v2testing.Current(t) targetPort := v2nettesting.PickPort() tcpServer := &tcp.Server{ Port: targetPort, 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}), targetPort)) 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 TestStreamLogger(t *testing.T) { v2testing.Current(t) buffer := bytes.NewBuffer(make([]byte, 0, 1024)) infoLogger = &stdOutLogWriter{ logger: log.New(buffer, "", 0), } Info("Test %s Format", "Stream Logger") assert.Bytes(buffer.Bytes()).Equals([]byte("[Info]Test Stream Logger Format\n")) buffer.Reset() errorLogger = infoLogger Error("Test No Format") assert.Bytes(buffer.Bytes()).Equals([]byte("[Error]Test No Format\n")) }
func TestBufferPrepend(t *testing.T) { v2testing.Current(t) buffer := NewBuffer().Clear() defer buffer.Release() buffer.Append([]byte{'a', 'b', 'c'}) buffer.Prepend([]byte{'x', 'y', 'z'}) assert.Int(buffer.Len()).Equals(6) assert.Bytes(buffer.Value).Equals([]byte("xyzabc")) buffer.Prepend([]byte{'u', 'v', 'w'}) assert.Bytes(buffer.Value).Equals([]byte("uvwxyzabc")) }
func TestResponseWrite(t *testing.T) { assert := assert.On(t) response := Socks5Response{ socksVersion, ErrorSuccess, AddrTypeIPv4, [4]byte{0x72, 0x72, 0x72, 0x72}, "", [16]byte{}, v2net.Port(53), } buffer := alloc.NewSmallBuffer().Clear() defer buffer.Release() response.Write(buffer) expectedBytes := []byte{ socksVersion, ErrorSuccess, byte(0x00), AddrTypeIPv4, 0x72, 0x72, 0x72, 0x72, byte(0x00), byte(0x035), } assert.Bytes(buffer.Value).Equals(expectedBytes) }
func TestSinglePacket(t *testing.T) { v2testing.Current(t) port := v2nettesting.PickPort() 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() freedom := &FreedomConnection{} traffic := ray.NewRay() data2Send := "Data to be sent to remote" payload := alloc.NewSmallBuffer().Clear().Append([]byte(data2Send)) packet := v2net.NewPacket(v2net.TCPDestination(v2net.IPAddress([]byte{127, 0, 0, 1}), port), payload, false) err = freedom.Dispatch(packet, traffic) assert.Error(err).IsNil() close(traffic.InboundInput()) respPayload := <-traffic.InboundOutput() defer respPayload.Release() assert.Bytes(respPayload.Value).Equals([]byte("Processed: Data to be sent to remote")) _, open := <-traffic.InboundOutput() assert.Bool(open).IsFalse() tcpServer.Close() }
func TestRandom(t *testing.T) { v2testing.Current(t) uuid := New() uuid2 := New() assert.StringLiteral(uuid.String()).NotEquals(uuid2.String()) assert.Bytes(uuid.Bytes()).NotEquals(uuid2.Bytes()) }
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 TestRandom(t *testing.T) { assert := assert.On(t) uuid := New() uuid2 := New() assert.String(uuid.String()).NotEquals(uuid2.String()) assert.Bytes(uuid.Bytes()).NotEquals(uuid2.Bytes()) }
func TestAuthenticationResponseWrite(t *testing.T) { assert := assert.On(t) response := NewAuthenticationResponse(byte(0x05)) buffer := bytes.NewBuffer(make([]byte, 0, 10)) WriteAuthentication(buffer, response) assert.Bytes(buffer.Bytes()).Equals([]byte{socksVersion, byte(0x05)}) }
func TestIPv6Request(t *testing.T) { assert := assert.On(t) request, err := ReadRequest(alloc.NewBuffer().Clear().AppendBytes(5, 1, 0, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 8)) assert.Error(err).IsNil() assert.Byte(request.Command).Equals(1) assert.Bytes(request.IPv6[:]).Equals([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}) assert.Port(request.Port).Equals(8) }
func TestNewUUID(t *testing.T) { assert := assert.On(t) uuid := New() uuid2, err := ParseString(uuid.String()) assert.Error(err).IsNil() assert.String(uuid.String()).Equals(uuid2.String()) assert.Bytes(uuid.Bytes()).Equals(uuid2.Bytes()) }
func TestNewUUID(t *testing.T) { v2testing.Current(t) uuid := New() uuid2, err := ParseString(uuid.String()) assert.Error(err).IsNil() assert.StringLiteral(uuid.String()).Equals(uuid2.String()) assert.Bytes(uuid.Bytes()).Equals(uuid2.Bytes()) }
func TestParseString(t *testing.T) { v2testing.Current(t) str := "2418d087-648d-4990-86e8-19dca1d006d3" expectedBytes := []byte{0x24, 0x18, 0xd0, 0x87, 0x64, 0x8d, 0x49, 0x90, 0x86, 0xe8, 0x19, 0xdc, 0xa1, 0xd0, 0x06, 0xd3} uuid, err := ParseString(str) assert.Error(err).IsNil() assert.Bytes(uuid.Bytes()).Equals(expectedBytes) }
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 TestSocks4AuthenticationResponseToBytes(t *testing.T) { assert := assert.On(t) response := NewSocks4AuthenticationResponse(byte(0x10), 443, []byte{1, 2, 3, 4}) buffer := alloc.NewSmallBuffer().Clear() defer buffer.Release() response.Write(buffer) assert.Bytes(buffer.Value).Equals([]byte{0x00, 0x10, 0x01, 0xBB, 0x01, 0x02, 0x03, 0x04}) }
func TestSetIPv6(t *testing.T) { assert := assert.On(t) response := NewSocks5Response() response.SetIPv6([]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}) buffer := alloc.NewSmallBuffer().Clear() defer buffer.Release() response.Write(buffer) assert.Bytes(buffer.Value).Equals([]byte{ socksVersion, 0, 0, AddrTypeIPv6, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0}) }
func TestIPv4Address(t *testing.T) { v2testing.Current(t) ip := []byte{byte(1), byte(2), byte(3), byte(4)} addr := v2net.IPAddress(ip) v2netassert.Address(addr).IsIPv4() v2netassert.Address(addr).IsNotIPv6() v2netassert.Address(addr).IsNotDomain() assert.Bytes(addr.IP()).Equals(ip) assert.String(addr).Equals("1.2.3.4") }
func TestSetDomain(t *testing.T) { assert := assert.On(t) response := NewSocks5Response() response.SetDomain("v2ray.com") buffer := alloc.NewSmallBuffer().Clear() defer buffer.Release() response.Write(buffer) assert.Bytes(buffer.Value).Equals([]byte{ socksVersion, 0, 0, AddrTypeDomain, 9, 118, 50, 114, 97, 121, 46, 99, 111, 109, 0, 0}) }
func TestAdaptiveWriter(t *testing.T) { assert := assert.On(t) lb := alloc.NewLargeBuffer() rand.Read(lb.Value) writeBuffer := make([]byte, 0, 1024*1024) writer := NewAdaptiveWriter(NewBufferedWriter(bytes.NewBuffer(writeBuffer))) err := writer.Write(lb) assert.Error(err).IsNil() assert.Bytes(lb.Bytes()).Equals(writeBuffer) }
func TestUDPRequestParsing(t *testing.T) { v2testing.Current(t) buffer := alloc.NewSmallBuffer().Clear() buffer.AppendBytes(1, 127, 0, 0, 1, 0, 80, 1, 2, 3, 4, 5, 6) request, err := ReadRequest(buffer, nil, true) assert.Error(err).IsNil() netassert.Address(request.Address).Equals(v2net.IPAddress([]byte{127, 0, 0, 1})) netassert.Port(request.Port).Equals(v2net.Port(80)) assert.Bool(request.OTA).IsFalse() assert.Bytes(request.UDPPayload.Value).Equals([]byte{1, 2, 3, 4, 5, 6}) }
func TestConfigParsing(t *testing.T) { v2testing.Current(t) rawJson := `{ "method": "aes-128-cfb", "password": "******" }` config := new(Config) err := json.Unmarshal([]byte(rawJson), config) assert.Error(err).IsNil() assert.Int(config.Cipher.KeySize()).Equals(16) assert.Bytes(config.Key).Equals([]byte{160, 224, 26, 2, 22, 110, 9, 80, 65, 52, 80, 20, 38, 243, 224, 241}) }
func TestSingleIO(t *testing.T) { assert := assert.On(t) content := bytes.NewBuffer(make([]byte, 0, 1024*1024)) writer := NewAuthChunkWriter(v2io.NewAdaptiveWriter(content)) writer.Write(alloc.NewBuffer().Clear().AppendString("abcd")) writer.Write(alloc.NewBuffer().Clear()) writer.Release() reader := NewAuthChunkReader(content) buffer, err := reader.Read() assert.Error(err).IsNil() assert.Bytes(buffer.Value).Equals([]byte("abcd")) }
func TestSocks4AuthenticationRequestRead(t *testing.T) { assert := assert.On(t) rawRequest := []byte{ 0x04, // version 0x01, // command 0x00, 0x35, 0x72, 0x72, 0x72, 0x72, } _, request4, err := ReadAuthentication(bytes.NewReader(rawRequest)) assert.Error(err).Equals(Socks4Downgrade) assert.Byte(request4.Version).Equals(0x04) assert.Byte(request4.Command).Equals(0x01) assert.Port(request4.Port).Equals(v2net.Port(53)) assert.Bytes(request4.IP[:]).Equals([]byte{0x72, 0x72, 0x72, 0x72}) }