From 88e076a28318c6a2637fde66436ed56cce6547bd Mon Sep 17 00:00:00 2001 From: 9seconds Date: Fri, 5 Mar 2021 17:36:21 +0300 Subject: [PATCH] Add tests for socks dialer --- go.mod | 1 + go.sum | 2 + mtglib/network/default_test.go | 30 ++++-------- mtglib/network/init_test.go | 27 +++++++++++ mtglib/network/socks5_test.go | 84 ++++++++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+), 20 deletions(-) create mode 100644 mtglib/network/init_test.go create mode 100644 mtglib/network/socks5_test.go diff --git a/go.mod b/go.mod index 12e986f..da2a623 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/9seconds/mtg/v2 go 1.16 require ( + github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 // indirect github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6 github.com/libp2p/go-reuseport v0.0.2 github.com/mccutchen/go-httpbin v1.1.1 // indirect diff --git a/go.sum b/go.sum index 616bf5c..4da8844 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6 h1:4NNbNM2Iq/k57qEu7WfL67UrbPq1uFWxW4qODCohi+0= github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6/go.mod h1:J29hk+f9lJrblVIfiJOtTFk+OblBawmib4uz/VdKzlg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/mtglib/network/default_test.go b/mtglib/network/default_test.go index 5da940f..203a2bb 100644 --- a/mtglib/network/default_test.go +++ b/mtglib/network/default_test.go @@ -3,29 +3,21 @@ package network_test import ( "context" "net/http" - "net/http/httptest" - "strings" "testing" "github.com/9seconds/mtg/v2/mtglib/network" - "github.com/mccutchen/go-httpbin/httpbin" "github.com/stretchr/testify/suite" ) type DefaultDialerTestSuite struct { - suite.Suite + HTTPServerTestSuite - d network.Dialer - srvAddress string - srv *httptest.Server + d network.Dialer } func (suite *DefaultDialerTestSuite) SetupSuite() { - suite.srv = httptest.NewServer(httpbin.NewHTTPBin().Handler()) - suite.srvAddress = strings.TrimPrefix(suite.srv.URL, "http://") -} + suite.HTTPServerTestSuite.SetupSuite() -func (suite *DefaultDialerTestSuite) SetupTest() { d, err := network.NewDefaultDialer(0, 0) suite.NoError(err) @@ -33,10 +25,6 @@ func (suite *DefaultDialerTestSuite) SetupTest() { suite.d = d } -func (suite *DefaultDialerTestSuite) TearDownSuite() { - suite.srv.Close() -} - func (suite *DefaultDialerTestSuite) TestNegativeTimeout() { _, err := network.NewDefaultDialer(-1, 0) @@ -50,7 +38,9 @@ func (suite *DefaultDialerTestSuite) TestNegativeBufferSize() { } func (suite *DefaultDialerTestSuite) TestUnsupportedProtocol() { - _, err := suite.d.DialContext(context.Background(), "udp", suite.srvAddress) + _, err := suite.d.DialContext(context.Background(), + "udp", + suite.HTTPServerAddress()) suite.Error(err) } @@ -58,7 +48,7 @@ func (suite *DefaultDialerTestSuite) TestUnsupportedProtocol() { func (suite *DefaultDialerTestSuite) TestCannotDial() { _, err := suite.d.DialContext(context.Background(), "tcp", - suite.srvAddress+suite.srvAddress) + suite.HTTPServerAddress()+suite.HTTPServerAddress()) suite.Error(err) } @@ -66,7 +56,7 @@ func (suite *DefaultDialerTestSuite) TestCannotDial() { func (suite *DefaultDialerTestSuite) TestConnectOk() { conn, err := suite.d.DialContext(context.Background(), "tcp", - suite.srvAddress) + suite.HTTPServerAddress()) suite.NoError(err) suite.NotNil(conn) @@ -74,14 +64,14 @@ func (suite *DefaultDialerTestSuite) TestConnectOk() { conn.Close() } -func (suite *DefaultDialerTestSuite) TestRequest() { +func (suite *DefaultDialerTestSuite) TestHTTPRequest() { httpClient := http.Client{ Transport: &http.Transport{ DialContext: suite.d.DialContext, }, } - resp, err := httpClient.Get(suite.srv.URL + "/get") + resp, err := httpClient.Get(suite.httpServer.URL + "/get") suite.NoError(err) diff --git a/mtglib/network/init_test.go b/mtglib/network/init_test.go new file mode 100644 index 0000000..8f8aeff --- /dev/null +++ b/mtglib/network/init_test.go @@ -0,0 +1,27 @@ +package network_test + +import ( + "net/http/httptest" + "strings" + + "github.com/mccutchen/go-httpbin/httpbin" + "github.com/stretchr/testify/suite" +) + +type HTTPServerTestSuite struct { + suite.Suite + + httpServer *httptest.Server +} + +func (suite *HTTPServerTestSuite) SetupSuite() { + suite.httpServer = httptest.NewServer(httpbin.NewHTTPBin().Handler()) +} + +func (suite *HTTPServerTestSuite) TearDownSuite() { + suite.httpServer.Close() +} + +func (suite *HTTPServerTestSuite) HTTPServerAddress() string { + return strings.TrimPrefix(suite.httpServer.URL, "http://") +} diff --git a/mtglib/network/socks5_test.go b/mtglib/network/socks5_test.go new file mode 100644 index 0000000..9f5e285 --- /dev/null +++ b/mtglib/network/socks5_test.go @@ -0,0 +1,84 @@ +package network_test + +import ( + "net" + "net/http" + "net/url" + "testing" + + "github.com/9seconds/mtg/v2/mtglib/network" + socks5 "github.com/armon/go-socks5" + "github.com/stretchr/testify/suite" +) + +type Socks5TestSuite struct { + HTTPServerTestSuite + + socksListener net.Listener + socksProxy *socks5.Server +} + +func (suite *Socks5TestSuite) SetupSuite() { + suite.HTTPServerTestSuite.SetupSuite() + + socksConf := socks5.Config{ + Credentials: socks5.StaticCredentials{ + "user": "password", + }, + } + + suite.socksProxy, _ = socks5.New(&socksConf) + suite.socksListener, _ = net.Listen("tcp", "127.0.0.1:0") + + go suite.socksProxy.Serve(suite.socksListener) +} + +func (suite *Socks5TestSuite) TearDownSuite() { + suite.socksListener.Close() + + suite.HTTPServerTestSuite.TearDownSuite() +} + +func (suite *Socks5TestSuite) TestRequestFailed() { + proxyURL := &url.URL{ + Scheme: "socks5", + User: url.UserPassword("user2", "password"), + Host: suite.socksListener.Addr().String(), + } + dialer, _ := network.NewSocks5Dialer(proxyURL, 0, 0) + + httpClient := http.Client{ + Transport: &http.Transport{ + DialContext: dialer.DialContext, + }, + } + + _, err := httpClient.Get(suite.httpServer.URL + "/get") + + suite.Error(err) +} + +func (suite *Socks5TestSuite) TestRequestOk() { + proxyURL := &url.URL{ + Scheme: "socks5", + User: url.UserPassword("user", "password"), + Host: suite.socksListener.Addr().String(), + } + dialer, _ := network.NewSocks5Dialer(proxyURL, 0, 0) + + httpClient := http.Client{ + Transport: &http.Transport{ + DialContext: dialer.DialContext, + }, + } + + resp, err := httpClient.Get(suite.httpServer.URL + "/get") + + suite.NoError(err) + + resp.Body.Close() +} + +func TestSocks5TestSuite(t *testing.T) { + suite.Run(t, &Socks5TestSuite{}) +}