From 1392a934458aa4c9a52ebd0efa0c2a6082b4b7c5 Mon Sep 17 00:00:00 2001 From: Denton Gentry Date: Sun, 18 Apr 2021 08:54:31 -0700 Subject: [PATCH] socks5: add a simple test Start up a backend service, put a SOCKS5 server in front of it, and verify that we can get data from the backend via SOCKS5. Signed-off-by: Denton Gentry --- net/socks5/socks5_test.go | 77 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 net/socks5/socks5_test.go diff --git a/net/socks5/socks5_test.go b/net/socks5/socks5_test.go new file mode 100644 index 000000000..8a5225da6 --- /dev/null +++ b/net/socks5/socks5_test.go @@ -0,0 +1,77 @@ +// Copyright (c) 2022 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package socks5 + +import ( + "fmt" + "io" + "net" + "testing" + + "golang.org/x/net/proxy" +) + +func socks5Server(listener net.Listener) { + var server Server + err := server.Serve(listener) + if err != nil { + panic(err) + } + listener.Close() +} + +func backendServer(listener net.Listener) { + conn, err := listener.Accept() + if err != nil { + panic(err) + } + conn.Write([]byte("Test")) + conn.Close() + listener.Close() +} + +func TestRead(t *testing.T) { + // backend server which we'll use SOCKS5 to connect to + listener, err := net.Listen("tcp", ":0") + if err != nil { + t.Fatal(err) + } + backendServerPort := listener.Addr().(*net.TCPAddr).Port + go backendServer(listener) + + // SOCKS5 server + socks5, err := net.Listen("tcp", ":0") + if err != nil { + t.Fatal(err) + } + socks5Port := socks5.Addr().(*net.TCPAddr).Port + go socks5Server(socks5) + + addr := fmt.Sprintf("localhost:%d", socks5Port) + socksDialer, err := proxy.SOCKS5("tcp", addr, nil, proxy.Direct) + if err != nil { + t.Fatal(err) + } + + addr = fmt.Sprintf("localhost:%d", backendServerPort) + conn, err := socksDialer.Dial("tcp", addr) + if err != nil { + t.Fatal(err) + } + + buf := make([]byte, 4) + _, err = io.ReadFull(conn, buf) + if err != nil { + t.Fatal(err) + } + if string(buf) != "Test" { + t.Fatalf("got: %q want: Test", buf) + } + + err = conn.Close() + if err != nil { + t.Fatal(err) + } +}