diff --git a/proxy/socks/socks_test.go b/proxy/socks/socks_test.go index 7adf9d578..416b5c8f4 100644 --- a/proxy/socks/socks_test.go +++ b/proxy/socks/socks_test.go @@ -114,3 +114,58 @@ func TestSocksTcpConnectWithUserPass(t *testing.T) { assert.Bytes(dataReturned).Equals(och.Data2Return) assert.String(targetServer).Equals(och.Destination.Address().String()) } + +func TestSocksUdpSend(t *testing.T) { + assert := unit.Assert(t) + port := uint16(12372) + + och := &mocks.OutboundConnectionHandler{ + Data2Send: bytes.NewBuffer(make([]byte, 0, 1024)), + Data2Return: []byte("The data to be returned to socks server."), + } + + core.RegisterOutboundConnectionHandlerFactory("mock_och", och) + + config := mocks.Config{ + PortValue: port, + InboundConfigValue: &mocks.ConnectionConfig{ + ProtocolValue: "socks", + ContentValue: []byte("{\"auth\": \"noauth\", \"udp\": true}"), + }, + OutboundConfigValue: &mocks.ConnectionConfig{ + ProtocolValue: "mock_och", + ContentValue: nil, + }, + } + + point, err := core.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[:nBytes]).Equals(och.Data2Return) + assert.Bytes(data2Send).Equals(och.Data2Send.Bytes()) + assert.String(och.Destination.String()).Equals("udp:8.8.4.4:53") +}