normal_test.go 9.1 KB
Newer Older
F
more ci  
fatedier 已提交
1
package ci
F
fatedier 已提交
2 3 4

import (
	"fmt"
F
fatedier 已提交
5
	"net/http"
F
fatedier 已提交
6
	"net/url"
F
fatedier 已提交
7
	"os"
F
fatedier 已提交
8
	"strings"
F
fatedier 已提交
9 10 11
	"testing"
	"time"

F
fatedier 已提交
12
	"github.com/gorilla/websocket"
F
fatedier 已提交
13
	"github.com/stretchr/testify/assert"
F
fatedier 已提交
14

F
fatedier 已提交
15
	"github.com/fatedier/frp/client/proxy"
F
fatedier 已提交
16
	"github.com/fatedier/frp/server/ports"
F
fatedier 已提交
17 18 19
	"github.com/fatedier/frp/tests/consts"
	"github.com/fatedier/frp/tests/mock"
	"github.com/fatedier/frp/tests/util"
F
fatedier 已提交
20 21

	gnet "github.com/fatedier/golib/net"
F
fatedier 已提交
22 23
)

F
fatedier 已提交
24
func TestMain(m *testing.M) {
F
fatedier 已提交
25 26 27 28 29 30 31 32 33 34 35
	var err error
	tcpEcho1 := mock.NewEchoServer(consts.TEST_TCP_PORT, 1, "")
	tcpEcho2 := mock.NewEchoServer(consts.TEST_TCP2_PORT, 2, "")

	if err = tcpEcho1.Start(); err != nil {
		panic(err)
	}
	if err = tcpEcho2.Start(); err != nil {
		panic(err)
	}

F
fatedier 已提交
36
	go mock.StartUDPEchoServer(consts.TEST_UDP_PORT)
F
fatedier 已提交
37
	go mock.StartUnixDomainServer(consts.TEST_UNIX_DOMAIN_ADDR)
F
fatedier 已提交
38
	go mock.StartHTTPServer(consts.TEST_HTTP_PORT)
F
fatedier 已提交
39

F
fatedier 已提交
40 41
	p1 := util.NewProcess(consts.FRPS_BIN_PATH, []string{"-c", "./auto_test_frps.ini"})
	if err = p1.Start(); err != nil {
F
fatedier 已提交
42 43 44
		panic(err)
	}

45
	time.Sleep(500 * time.Millisecond)
F
fatedier 已提交
46 47
	p2 := util.NewProcess(consts.FRPC_BIN_PATH, []string{"-c", "./auto_test_frpc.ini"})
	if err = p2.Start(); err != nil {
F
fatedier 已提交
48 49
		panic(err)
	}
F
fatedier 已提交
50 51 52

	p3 := util.NewProcess(consts.FRPC_BIN_PATH, []string{"-c", "./auto_test_frpc_visitor.ini"})
	if err = p3.Start(); err != nil {
F
fatedier 已提交
53 54
		panic(err)
	}
F
fatedier 已提交
55
	time.Sleep(500 * time.Millisecond)
F
fatedier 已提交
56

F
fatedier 已提交
57 58 59 60 61
	exitCode := m.Run()
	p1.Stop()
	p2.Stop()
	p3.Stop()
	os.Exit(exitCode)
F
fatedier 已提交
62 63
}

F
fatedier 已提交
64
func TestHTTP(t *testing.T) {
F
fatedier 已提交
65 66
	assert := assert.New(t)
	// web01
F
fatedier 已提交
67
	code, body, _, err := util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "", nil, "")
F
fatedier 已提交
68 69
	if assert.NoError(err) {
		assert.Equal(200, code)
F
fatedier 已提交
70
		assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
F
fatedier 已提交
71 72 73
	}

	// web02
F
fatedier 已提交
74
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test2.frp.com", nil, "")
F
fatedier 已提交
75 76
	if assert.NoError(err) {
		assert.Equal(200, code)
F
fatedier 已提交
77
		assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
F
fatedier 已提交
78 79 80
	}

	// error host header
F
fatedier 已提交
81
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "errorhost.frp.com", nil, "")
F
fatedier 已提交
82 83 84 85 86
	if assert.NoError(err) {
		assert.Equal(404, code)
	}

	// web03
F
fatedier 已提交
87
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
F
fatedier 已提交
88 89
	if assert.NoError(err) {
		assert.Equal(200, code)
F
fatedier 已提交
90
		assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
F
fatedier 已提交
91
	}
F
fatedier 已提交
92

F
fatedier 已提交
93
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/foo", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
F
fatedier 已提交
94 95
	if assert.NoError(err) {
		assert.Equal(200, code)
F
fatedier 已提交
96
		assert.Equal(consts.TEST_HTTP_FOO_STR, body)
F
fatedier 已提交
97 98 99
	}

	// web04
F
fatedier 已提交
100
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/bar", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
F
fatedier 已提交
101 102
	if assert.NoError(err) {
		assert.Equal(200, code)
F
fatedier 已提交
103
		assert.Equal(consts.TEST_HTTP_BAR_STR, body)
F
fatedier 已提交
104 105 106
	}

	// web05
F
fatedier 已提交
107
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test5.frp.com", nil, "")
F
fatedier 已提交
108 109 110 111
	if assert.NoError(err) {
		assert.Equal(401, code)
	}

F
fatedier 已提交
112
	headers := make(map[string]string)
F
fatedier 已提交
113
	headers["Authorization"] = util.BasicAuth("test", "test")
F
fatedier 已提交
114
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test5.frp.com", headers, "")
F
fatedier 已提交
115 116
	if assert.NoError(err) {
		assert.Equal(401, code)
F
fatedier 已提交
117
	}
F
fatedier 已提交
118

F
fatedier 已提交
119 120
	// web06
	var header http.Header
F
fatedier 已提交
121
	code, body, header, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test6.frp.com", nil, "")
F
fatedier 已提交
122 123
	if assert.NoError(err) {
		assert.Equal(200, code)
F
fatedier 已提交
124
		assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
F
fatedier 已提交
125 126 127
		assert.Equal("true", header.Get("X-Header-Set"))
	}

128 129
	// wildcard_http
	// test.frp1.com match *.frp1.com
F
fatedier 已提交
130
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test.frp1.com", nil, "")
131 132 133 134 135 136
	if assert.NoError(err) {
		assert.Equal(200, code)
		assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
	}

	// new.test.frp1.com also match *.frp1.com
F
fatedier 已提交
137
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "new.test.frp1.com", nil, "")
138 139 140 141 142
	if assert.NoError(err) {
		assert.Equal(200, code)
		assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
	}

F
fatedier 已提交
143
	// subhost01
F
fatedier 已提交
144
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test01.sub.com", nil, "")
F
fatedier 已提交
145 146 147 148 149 150
	if assert.NoError(err) {
		assert.Equal(200, code)
		assert.Equal("test01.sub.com", body)
	}

	// subhost02
F
fatedier 已提交
151
	code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test02.sub.com", nil, "")
F
fatedier 已提交
152 153 154 155
	if assert.NoError(err) {
		assert.Equal(200, code)
		assert.Equal("test02.sub.com", body)
	}
F
fatedier 已提交
156
}
F
fatedier 已提交
157

F
fatedier 已提交
158
func TestTCPMux(t *testing.T) {
159 160 161 162
	assert := assert.New(t)

	conn, err := gnet.DialTcpByProxy(fmt.Sprintf("http://%s:%d", "127.0.0.1", consts.TEST_TCP_MUX_FRP_PORT), "tunnel1")
	if assert.NoError(err) {
F
fatedier 已提交
163
		res, err := util.SendTCPMsgByConn(conn, consts.TEST_TCP_ECHO_STR)
164 165 166 167 168
		assert.NoError(err)
		assert.Equal(consts.TEST_TCP_ECHO_STR, res)
	}
}

F
fatedier 已提交
169 170 171
func TestWebSocket(t *testing.T) {
	assert := assert.New(t)

F
fatedier 已提交
172
	u := url.URL{Scheme: "ws", Host: fmt.Sprintf("%s:%d", "127.0.0.1", consts.TEST_HTTP_FRP_PORT), Path: "/ws"}
F
fatedier 已提交
173 174 175 176
	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	assert.NoError(err)
	defer c.Close()

F
fatedier 已提交
177
	err = c.WriteMessage(websocket.TextMessage, []byte(consts.TEST_HTTP_NORMAL_STR))
F
fatedier 已提交
178 179 180 181
	assert.NoError(err)

	_, msg, err := c.ReadMessage()
	assert.NoError(err)
F
fatedier 已提交
182
	assert.Equal(consts.TEST_HTTP_NORMAL_STR, string(msg))
F
fatedier 已提交
183 184
}

F
fatedier 已提交
185
func TestAllowPorts(t *testing.T) {
F
fatedier 已提交
186 187
	assert := assert.New(t)
	// Port not allowed
F
fatedier 已提交
188
	status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortNotAllowed)
F
fatedier 已提交
189
	if assert.NoError(err) {
F
fatedier 已提交
190
		assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
F
fatedier 已提交
191
		assert.True(strings.Contains(status.Err, ports.ErrPortNotAllowed.Error()))
F
fatedier 已提交
192 193
	}

F
fatedier 已提交
194
	status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPPortNotAllowed)
F
fatedier 已提交
195
	if assert.NoError(err) {
F
fatedier 已提交
196
		assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
F
fatedier 已提交
197
		assert.True(strings.Contains(status.Err, ports.ErrPortNotAllowed.Error()))
F
fatedier 已提交
198 199
	}

F
fatedier 已提交
200
	status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortUnavailable)
F
fatedier 已提交
201
	if assert.NoError(err) {
F
fatedier 已提交
202
		assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
F
fatedier 已提交
203
		assert.True(strings.Contains(status.Err, ports.ErrPortUnAvailable.Error()))
F
fatedier 已提交
204 205 206
	}

	// Port normal
F
fatedier 已提交
207
	status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortNormal)
F
fatedier 已提交
208
	if assert.NoError(err) {
F
fatedier 已提交
209
		assert.Equal(proxy.ProxyPhaseRunning, status.Status)
F
fatedier 已提交
210 211
	}

F
fatedier 已提交
212
	status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPPortNormal)
F
fatedier 已提交
213
	if assert.NoError(err) {
F
fatedier 已提交
214
		assert.Equal(proxy.ProxyPhaseRunning, status.Status)
F
fatedier 已提交
215 216 217 218 219 220
	}
}

func TestRandomPort(t *testing.T) {
	assert := assert.New(t)
	// tcp
F
fatedier 已提交
221
	status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPRandomPort)
F
fatedier 已提交
222 223
	if assert.NoError(err) {
		addr := status.RemoteAddr
F
fatedier 已提交
224
		res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
F
fatedier 已提交
225
		assert.NoError(err)
F
fatedier 已提交
226
		assert.Equal(consts.TEST_TCP_ECHO_STR, res)
F
fatedier 已提交
227 228 229
	}

	// udp
F
fatedier 已提交
230
	status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPRandomPort)
F
fatedier 已提交
231 232
	if assert.NoError(err) {
		addr := status.RemoteAddr
F
fatedier 已提交
233
		res, err := util.SendUDPMsg(addr, consts.TEST_UDP_ECHO_STR)
F
fatedier 已提交
234
		assert.NoError(err)
F
fatedier 已提交
235
		assert.Equal(consts.TEST_UDP_ECHO_STR, res)
F
fatedier 已提交
236 237
	}
}
F
fatedier 已提交
238

F
fatedier 已提交
239
func TestPluginHTTPProxy(t *testing.T) {
F
fatedier 已提交
240
	assert := assert.New(t)
F
fatedier 已提交
241
	status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyHTTPProxy)
F
fatedier 已提交
242
	if assert.NoError(err) {
F
fatedier 已提交
243
		assert.Equal(proxy.ProxyPhaseRunning, status.Status)
F
fatedier 已提交
244 245 246

		// http proxy
		addr := status.RemoteAddr
F
fatedier 已提交
247
		code, body, _, err := util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT),
F
fatedier 已提交
248 249 250
			"", nil, "http://"+addr)
		if assert.NoError(err) {
			assert.Equal(200, code)
F
fatedier 已提交
251
			assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
F
fatedier 已提交
252 253 254
		}

		// connect method
F
fatedier 已提交
255
		conn, err := gnet.DialTcpByProxy("http://"+addr, fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP_FRP_PORT))
F
fatedier 已提交
256
		if assert.NoError(err) {
F
fatedier 已提交
257
			res, err := util.SendTCPMsgByConn(conn, consts.TEST_TCP_ECHO_STR)
F
fatedier 已提交
258
			assert.NoError(err)
F
fatedier 已提交
259
			assert.Equal(consts.TEST_TCP_ECHO_STR, res)
F
fatedier 已提交
260 261 262
		}
	}
}
263 264 265 266 267

func TestRangePortsMapping(t *testing.T) {
	assert := assert.New(t)

	for i := 0; i < 3; i++ {
F
fatedier 已提交
268
		name := fmt.Sprintf("%s_%d", consts.ProxyRangeTCPPrefix, i)
F
fatedier 已提交
269
		status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, name)
270
		if assert.NoError(err) {
F
fatedier 已提交
271
			assert.Equal(proxy.ProxyPhaseRunning, status.Status)
272 273 274
		}
	}
}
F
fatedier 已提交
275 276 277 278 279 280 281 282

func TestGroup(t *testing.T) {
	assert := assert.New(t)

	var (
		p1 int
		p2 int
	)
F
fatedier 已提交
283
	addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP2_FRP_PORT)
F
fatedier 已提交
284 285

	for i := 0; i < 6; i++ {
F
fatedier 已提交
286
		res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
F
fatedier 已提交
287 288
		assert.NoError(err)
		switch res {
F
fatedier 已提交
289
		case consts.TEST_TCP_ECHO_STR:
F
fatedier 已提交
290
			p1++
F
fatedier 已提交
291
		case consts.TEST_TCP_ECHO_STR + consts.TEST_TCP_ECHO_STR:
F
fatedier 已提交
292 293 294 295 296
			p2++
		}
	}
	assert.True(p1 > 0 && p2 > 0, "group proxies load balancing")
}