Explorar el Código

Make tests for load balanced client

tags/v2.0.0-rc1
9seconds hace 5 años
padre
commit
ba875da9b5

+ 4
- 8
mtglib/network/default_test.go Ver fichero

@@ -10,6 +10,7 @@ import (
10 10
 )
11 11
 
12 12
 type DefaultDialerTestSuite struct {
13
+	suite.Suite
13 14
 	HTTPServerTestSuite
14 15
 
15 16
 	d network.Dialer
@@ -65,17 +66,12 @@ func (suite *DefaultDialerTestSuite) TestConnectOk() {
65 66
 }
66 67
 
67 68
 func (suite *DefaultDialerTestSuite) TestHTTPRequest() {
68
-	httpClient := http.Client{
69
-		Transport: &http.Transport{
70
-			DialContext: suite.d.DialContext,
71
-		},
72
-	}
69
+	httpClient := suite.MakeHTTPClient(suite.d)
73 70
 
74
-	resp, err := httpClient.Get(suite.httpServer.URL + "/get")
71
+	resp, err := httpClient.Get(suite.MakeURL("/get"))
75 72
 
76 73
 	suite.NoError(err)
77
-
78
-	resp.Body.Close()
74
+    suite.Equal(http.StatusOK, resp.StatusCode)
79 75
 }
80 76
 
81 77
 func TestDefaultDialer(t *testing.T) {

+ 104
- 3
mtglib/network/init_test.go Ver fichero

@@ -1,16 +1,77 @@
1 1
 package network_test
2 2
 
3 3
 import (
4
+	"context"
5
+	"net"
6
+	"net/http"
4 7
 	"net/http/httptest"
8
+	"net/url"
5 9
 	"strings"
10
+	"time"
6 11
 
12
+	"github.com/9seconds/mtg/v2/mtglib/network"
13
+	socks5 "github.com/armon/go-socks5"
7 14
 	"github.com/mccutchen/go-httpbin/httpbin"
8
-	"github.com/stretchr/testify/suite"
15
+	"github.com/stretchr/testify/mock"
9 16
 )
10 17
 
11
-type HTTPServerTestSuite struct {
12
-	suite.Suite
18
+type ConnMock struct {
19
+	mock.Mock
20
+}
21
+
22
+func (c *ConnMock) Read(b []byte) (int, error) {
23
+	args := c.Called(b)
24
+
25
+	return args.Int(0), args.Error(1)
26
+}
27
+
28
+func (c *ConnMock) Write(b []byte) (int, error) {
29
+	args := c.Called(b)
30
+
31
+	return args.Int(0), args.Error(1)
32
+}
33
+
34
+func (c *ConnMock) Close() error {
35
+	return c.Called().Error(0)
36
+}
37
+
38
+func (c *ConnMock) LocalAddr() net.Addr {
39
+	return c.Called().Get(0).(net.Addr)
40
+}
41
+
42
+func (c *ConnMock) RemoteAddr() net.Addr {
43
+	return c.Called().Get(0).(net.Addr)
44
+}
45
+
46
+func (c *ConnMock) SetDeadline(t time.Time) error {
47
+	return c.Called(t).Error(0)
48
+}
49
+
50
+func (c *ConnMock) SetReadDeadline(t time.Time) error {
51
+	return c.Called(t).Error(0)
52
+}
53
+
54
+func (c *ConnMock) SetWriteDeadline(t time.Time) error {
55
+	return c.Called(t).Error(0)
56
+}
57
+
58
+type DialerMock struct {
59
+	mock.Mock
60
+}
61
+
62
+func (d *DialerMock) Dial(network, address string) (net.Conn, error) {
63
+	args := d.Called(network, address)
64
+
65
+	return args.Get(0).(net.Conn), args.Error(1)
66
+}
67
+
68
+func (d *DialerMock) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
69
+	args := d.Called(ctx, network, address)
13 70
 
71
+	return args.Get(0).(net.Conn), args.Error(1)
72
+}
73
+
74
+type HTTPServerTestSuite struct {
14 75
 	httpServer *httptest.Server
15 76
 }
16 77
 
@@ -25,3 +86,43 @@ func (suite *HTTPServerTestSuite) TearDownSuite() {
25 86
 func (suite *HTTPServerTestSuite) HTTPServerAddress() string {
26 87
 	return strings.TrimPrefix(suite.httpServer.URL, "http://")
27 88
 }
89
+
90
+func (suite *HTTPServerTestSuite) MakeURL(path string) string {
91
+	return suite.httpServer.URL + path
92
+}
93
+
94
+func (suite *HTTPServerTestSuite) MakeHTTPClient(dialer network.Dialer) *http.Client {
95
+	return &http.Client{
96
+		Transport: &http.Transport{
97
+			DialContext: dialer.DialContext,
98
+		},
99
+	}
100
+}
101
+
102
+type Socks5ServerTestSuite struct {
103
+	socks5Listener net.Listener
104
+	socks5Server   *socks5.Server
105
+}
106
+
107
+func (suite *Socks5ServerTestSuite) SetupSuite() {
108
+	suite.socks5Listener, _ = net.Listen("tcp", "127.0.0.1:0")
109
+	suite.socks5Server, _ = socks5.New(&socks5.Config{
110
+		Credentials: socks5.StaticCredentials{
111
+			"user": "password",
112
+		},
113
+	})
114
+
115
+	go suite.socks5Server.Serve(suite.socks5Listener)
116
+}
117
+
118
+func (suite *Socks5ServerTestSuite) TearDownSuite() {
119
+	suite.socks5Listener.Close()
120
+}
121
+
122
+func (suite *Socks5ServerTestSuite) MakeSocks5URL(user, password string) *url.URL {
123
+	return &url.URL{
124
+		Scheme: "socks5",
125
+		User:   url.UserPassword(user, password),
126
+		Host:   suite.socks5Listener.Addr().String(),
127
+	}
128
+}

+ 88
- 0
mtglib/network/load_balanced_socks5_test.go Ver fichero

@@ -0,0 +1,88 @@
1
+package network_test
2
+
3
+import (
4
+	"errors"
5
+	"io"
6
+	"net"
7
+	"net/http"
8
+	"net/url"
9
+	"testing"
10
+
11
+	"github.com/9seconds/mtg/v2/mtglib/network"
12
+	"github.com/stretchr/testify/mock"
13
+	"github.com/stretchr/testify/suite"
14
+)
15
+
16
+type LoadBalancedSocks5TestSuite struct {
17
+	suite.Suite
18
+	HTTPServerTestSuite
19
+	Socks5ServerTestSuite
20
+
21
+	httpClient *http.Client
22
+}
23
+
24
+func (suite *LoadBalancedSocks5TestSuite) SetupSuite() {
25
+	suite.HTTPServerTestSuite.SetupSuite()
26
+	suite.Socks5ServerTestSuite.SetupSuite()
27
+}
28
+
29
+func (suite *LoadBalancedSocks5TestSuite) SetupTest() {
30
+	baseDialer, _ := network.NewDefaultDialer(0, 0)
31
+
32
+	lbDialer, err := network.NewLoadBalancedSocks5Dialer(baseDialer, []*url.URL{
33
+		suite.MakeSocks5URL("user", "password"),
34
+		suite.MakeSocks5URL("user2", "password"),
35
+	})
36
+
37
+	suite.NoError(err)
38
+
39
+	suite.httpClient = suite.MakeHTTPClient(lbDialer)
40
+}
41
+
42
+func (suite *LoadBalancedSocks5TestSuite) TearDownSuite() {
43
+	suite.Socks5ServerTestSuite.SetupSuite()
44
+	suite.HTTPServerTestSuite.SetupSuite()
45
+}
46
+
47
+func (suite *LoadBalancedSocks5TestSuite) TestIncorrectURL() {
48
+	_, err := network.NewLoadBalancedSocks5Dialer(&DialerMock{}, []*url.URL{
49
+		{Scheme: "http"},
50
+	})
51
+
52
+	suite.Error(err)
53
+}
54
+
55
+func (suite *LoadBalancedSocks5TestSuite) TestCannotDial() {
56
+	baseDialer := &DialerMock{}
57
+
58
+	baseDialer.On("DialContext", mock.Anything, "tcp", "127.0.0.1:1080").
59
+		Times(network.ProxyDialerOpenThreshold).
60
+		Return(&net.TCPConn{}, io.EOF)
61
+	baseDialer.On("DialContext", mock.Anything, "tcp", "127.0.0.2:1080").
62
+		Times(network.ProxyDialerOpenThreshold).
63
+		Return(&net.TCPConn{}, io.EOF)
64
+
65
+	lbDialer, err := network.NewLoadBalancedSocks5Dialer(baseDialer, []*url.URL{
66
+		{Scheme: "socks5", User: url.UserPassword("user", "password"), Host: "127.0.0.1:1080"},
67
+		{Scheme: "socks5", User: url.UserPassword("user", "password"), Host: "127.0.0.2:1080"},
68
+	})
69
+	suite.NoError(err)
70
+
71
+	for i := 0; i < network.ProxyDialerOpenThreshold*2; i++ {
72
+		_, err = lbDialer.Dial("tcp", "127.1.1.1:80")
73
+		suite.True(errors.Is(err, network.ErrCannotDialWithAllProxies))
74
+	}
75
+
76
+	baseDialer.AssertExpectations(suite.T())
77
+}
78
+
79
+func (suite *LoadBalancedSocks5TestSuite) TestDialOk() {
80
+	resp, err := suite.httpClient.Get(suite.MakeURL("/get"))
81
+
82
+	suite.NoError(err)
83
+	suite.Equal(http.StatusOK, resp.StatusCode)
84
+}
85
+
86
+func TestLoadBalancedSocks5(t *testing.T) {
87
+	suite.Run(t, &LoadBalancedSocks5TestSuite{})
88
+}

+ 15
- 47
mtglib/network/socks5_test.go Ver fichero

@@ -1,84 +1,52 @@
1 1
 package network_test
2 2
 
3 3
 import (
4
-	"net"
5 4
 	"net/http"
6
-	"net/url"
7 5
 	"testing"
8 6
 
9 7
 	"github.com/9seconds/mtg/v2/mtglib/network"
10
-	socks5 "github.com/armon/go-socks5"
11 8
 	"github.com/stretchr/testify/suite"
12 9
 )
13 10
 
14 11
 type Socks5TestSuite struct {
12
+	suite.Suite
15 13
 	HTTPServerTestSuite
14
+	Socks5ServerTestSuite
16 15
 
17
-	baseDialer    network.Dialer
18
-	socksListener net.Listener
19
-	socksProxy    *socks5.Server
16
+	d network.Dialer
20 17
 }
21 18
 
22 19
 func (suite *Socks5TestSuite) SetupSuite() {
23 20
 	suite.HTTPServerTestSuite.SetupSuite()
21
+	suite.Socks5ServerTestSuite.SetupSuite()
24 22
 
25
-	socksConf := socks5.Config{
26
-		Credentials: socks5.StaticCredentials{
27
-			"user": "password",
28
-		},
29
-	}
30
-
31
-	suite.socksProxy, _ = socks5.New(&socksConf)
32
-	suite.socksListener, _ = net.Listen("tcp", "127.0.0.1:0")
33
-    suite.baseDialer, _ = network.NewDefaultDialer(0, 0)
34
-
35
-	go suite.socksProxy.Serve(suite.socksListener)
23
+	suite.d, _ = network.NewDefaultDialer(0, 0)
36 24
 }
37 25
 
38 26
 func (suite *Socks5TestSuite) TearDownSuite() {
39
-	suite.socksListener.Close()
40
-
27
+	suite.Socks5ServerTestSuite.TearDownSuite()
41 28
 	suite.HTTPServerTestSuite.TearDownSuite()
42 29
 }
43 30
 
44 31
 func (suite *Socks5TestSuite) TestRequestFailed() {
45
-	proxyURL := &url.URL{
46
-		Scheme: "socks5",
47
-		User:   url.UserPassword("user2", "password"),
48
-		Host:   suite.socksListener.Addr().String(),
49
-	}
50
-	dialer, _ := network.NewSocks5Dialer(suite.baseDialer, proxyURL)
32
+	proxyURL := suite.MakeSocks5URL("user2", "password")
33
+	dialer, _ := network.NewSocks5Dialer(suite.d, proxyURL)
34
+	httpClient := suite.MakeHTTPClient(dialer)
51 35
 
52
-	httpClient := http.Client{
53
-		Transport: &http.Transport{
54
-			DialContext: dialer.DialContext,
55
-		},
56
-	}
57
-
58
-	_, err := httpClient.Get(suite.httpServer.URL + "/get")
36
+	_, err := httpClient.Get(suite.MakeURL("/get"))
59 37
 
60 38
 	suite.Error(err)
61 39
 }
62 40
 
63 41
 func (suite *Socks5TestSuite) TestRequestOk() {
64
-	proxyURL := &url.URL{
65
-		Scheme: "socks5",
66
-		User:   url.UserPassword("user", "password"),
67
-		Host:   suite.socksListener.Addr().String(),
68
-	}
69
-	dialer, _ := network.NewSocks5Dialer(suite.baseDialer, proxyURL)
70
-
71
-	httpClient := http.Client{
72
-		Transport: &http.Transport{
73
-			DialContext: dialer.DialContext,
74
-		},
75
-	}
42
+	proxyURL := suite.MakeSocks5URL("user", "password")
43
+	dialer, _ := network.NewSocks5Dialer(suite.d, proxyURL)
44
+	httpClient := suite.MakeHTTPClient(dialer)
76 45
 
77
-	resp, err := httpClient.Get(suite.httpServer.URL + "/get")
46
+	resp, err := httpClient.Get(suite.MakeURL("/get"))
78 47
 
79 48
 	suite.NoError(err)
80
-
81
-	resp.Body.Close()
49
+	suite.Equal(http.StatusOK, resp.StatusCode)
82 50
 }
83 51
 
84 52
 func TestSocks5TestSuite(t *testing.T) {

Loading…
Cancelar
Guardar