123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- package ci
- import (
- "fmt"
- "net/http"
- "net/url"
- "os"
- "strings"
- "testing"
- "time"
- "github.com/gorilla/websocket"
- "github.com/stretchr/testify/assert"
- "github.com/fatedier/frp/client/proxy"
- "github.com/fatedier/frp/server/ports"
- "github.com/fatedier/frp/tests/consts"
- "github.com/fatedier/frp/tests/mock"
- "github.com/fatedier/frp/tests/util"
- gnet "github.com/fatedier/golib/net"
- )
- func TestMain(m *testing.M) {
- 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)
- }
- go mock.StartUDPEchoServer(consts.TEST_UDP_PORT)
- go mock.StartUnixDomainServer(consts.TEST_UNIX_DOMAIN_ADDR)
- go mock.StartHTTPServer(consts.TEST_HTTP_PORT)
- p1 := util.NewProcess(consts.FRPS_BIN_PATH, []string{"-c", "./auto_test_frps.ini"})
- if err = p1.Start(); err != nil {
- panic(err)
- }
- time.Sleep(200 * time.Millisecond)
- p2 := util.NewProcess(consts.FRPC_BIN_PATH, []string{"-c", "./auto_test_frpc.ini"})
- if err = p2.Start(); err != nil {
- panic(err)
- }
- p3 := util.NewProcess(consts.FRPC_BIN_PATH, []string{"-c", "./auto_test_frpc_visitor.ini"})
- if err = p3.Start(); err != nil {
- panic(err)
- }
- time.Sleep(500 * time.Millisecond)
- exitCode := m.Run()
- p1.Stop()
- p2.Stop()
- p3.Stop()
- os.Exit(exitCode)
- }
- func TestTCP(t *testing.T) {
- assert := assert.New(t)
- // Normal
- addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP_FRP_PORT)
- res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
- assert.NoError(err)
- assert.Equal(consts.TEST_TCP_ECHO_STR, res)
- // Encrytion and compression
- addr = fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP_EC_FRP_PORT)
- res, err = util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
- assert.NoError(err)
- assert.Equal(consts.TEST_TCP_ECHO_STR, res)
- }
- func TestUDP(t *testing.T) {
- assert := assert.New(t)
- // Normal
- addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_UDP_FRP_PORT)
- res, err := util.SendUDPMsg(addr, consts.TEST_UDP_ECHO_STR)
- assert.NoError(err)
- assert.Equal(consts.TEST_UDP_ECHO_STR, res)
- // Encrytion and compression
- addr = fmt.Sprintf("127.0.0.1:%d", consts.TEST_UDP_EC_FRP_PORT)
- res, err = util.SendUDPMsg(addr, consts.TEST_UDP_ECHO_STR)
- assert.NoError(err)
- assert.Equal(consts.TEST_UDP_ECHO_STR, res)
- }
- func TestUnixDomain(t *testing.T) {
- assert := assert.New(t)
- // Normal
- addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_UNIX_DOMAIN_FRP_PORT)
- res, err := util.SendTCPMsg(addr, consts.TEST_UNIX_DOMAIN_STR)
- if assert.NoError(err) {
- assert.Equal(consts.TEST_UNIX_DOMAIN_STR, res)
- }
- }
- func TestSTCP(t *testing.T) {
- assert := assert.New(t)
- // Normal
- addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_STCP_FRP_PORT)
- res, err := util.SendTCPMsg(addr, consts.TEST_STCP_ECHO_STR)
- if assert.NoError(err) {
- assert.Equal(consts.TEST_STCP_ECHO_STR, res)
- }
- // Encrytion and compression
- addr = fmt.Sprintf("127.0.0.1:%d", consts.TEST_STCP_EC_FRP_PORT)
- res, err = util.SendTCPMsg(addr, consts.TEST_STCP_ECHO_STR)
- if assert.NoError(err) {
- assert.Equal(consts.TEST_STCP_ECHO_STR, res)
- }
- }
- func TestSUDP(t *testing.T) {
- assert := assert.New(t)
- // Normal
- addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_SUDP_FRP_PORT)
- res, err := util.SendUDPMsg(addr, consts.TEST_SUDP_ECHO_STR)
- assert.NoError(err)
- assert.Equal(consts.TEST_SUDP_ECHO_STR, res)
- }
- func TestHTTP(t *testing.T) {
- assert := assert.New(t)
- // web01
- code, body, _, err := util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
- }
- // web02
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test2.frp.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
- }
- // error host header
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "errorhost.frp.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(404, code)
- }
- // web03
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
- }
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/foo", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal(consts.TEST_HTTP_FOO_STR, body)
- }
- // web04
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/bar", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal(consts.TEST_HTTP_BAR_STR, body)
- }
- // web05
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test5.frp.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(401, code)
- }
- headers := make(map[string]string)
- headers["Authorization"] = util.BasicAuth("test", "test")
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test5.frp.com", headers, "")
- if assert.NoError(err) {
- assert.Equal(401, code)
- }
- // web06
- var header http.Header
- code, body, header, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test6.frp.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
- assert.Equal("true", header.Get("X-Header-Set"))
- }
- // wildcard_http
- // test.frp1.com match *.frp1.com
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test.frp1.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
- }
- // new.test.frp1.com also match *.frp1.com
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "new.test.frp1.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
- }
- // subhost01
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test01.sub.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal("test01.sub.com", body)
- }
- // subhost02
- code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test02.sub.com", nil, "")
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal("test02.sub.com", body)
- }
- }
- func TestTCPMux(t *testing.T) {
- 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) {
- res, err := util.SendTCPMsgByConn(conn, consts.TEST_TCP_ECHO_STR)
- assert.NoError(err)
- assert.Equal(consts.TEST_TCP_ECHO_STR, res)
- }
- }
- func TestWebSocket(t *testing.T) {
- assert := assert.New(t)
- u := url.URL{Scheme: "ws", Host: fmt.Sprintf("%s:%d", "127.0.0.1", consts.TEST_HTTP_FRP_PORT), Path: "/ws"}
- c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
- assert.NoError(err)
- defer c.Close()
- err = c.WriteMessage(websocket.TextMessage, []byte(consts.TEST_HTTP_NORMAL_STR))
- assert.NoError(err)
- _, msg, err := c.ReadMessage()
- assert.NoError(err)
- assert.Equal(consts.TEST_HTTP_NORMAL_STR, string(msg))
- }
- func TestAllowPorts(t *testing.T) {
- assert := assert.New(t)
- // Port not allowed
- status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortNotAllowed)
- if assert.NoError(err) {
- assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
- assert.True(strings.Contains(status.Err, ports.ErrPortNotAllowed.Error()))
- }
- status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPPortNotAllowed)
- if assert.NoError(err) {
- assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
- assert.True(strings.Contains(status.Err, ports.ErrPortNotAllowed.Error()))
- }
- status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortUnavailable)
- if assert.NoError(err) {
- assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
- assert.True(strings.Contains(status.Err, ports.ErrPortUnAvailable.Error()))
- }
- // Port normal
- status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortNormal)
- if assert.NoError(err) {
- assert.Equal(proxy.ProxyPhaseRunning, status.Status)
- }
- status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPPortNormal)
- if assert.NoError(err) {
- assert.Equal(proxy.ProxyPhaseRunning, status.Status)
- }
- }
- func TestRandomPort(t *testing.T) {
- assert := assert.New(t)
- // tcp
- status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPRandomPort)
- if assert.NoError(err) {
- addr := status.RemoteAddr
- res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
- assert.NoError(err)
- assert.Equal(consts.TEST_TCP_ECHO_STR, res)
- }
- // udp
- status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPRandomPort)
- if assert.NoError(err) {
- addr := status.RemoteAddr
- res, err := util.SendUDPMsg(addr, consts.TEST_UDP_ECHO_STR)
- assert.NoError(err)
- assert.Equal(consts.TEST_UDP_ECHO_STR, res)
- }
- }
- func TestPluginHTTPProxy(t *testing.T) {
- assert := assert.New(t)
- status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyHTTPProxy)
- if assert.NoError(err) {
- assert.Equal(proxy.ProxyPhaseRunning, status.Status)
- // http proxy
- addr := status.RemoteAddr
- code, body, _, err := util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT),
- "", nil, "http://"+addr)
- if assert.NoError(err) {
- assert.Equal(200, code)
- assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
- }
- // connect method
- conn, err := gnet.DialTcpByProxy("http://"+addr, fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP_FRP_PORT))
- if assert.NoError(err) {
- res, err := util.SendTCPMsgByConn(conn, consts.TEST_TCP_ECHO_STR)
- assert.NoError(err)
- assert.Equal(consts.TEST_TCP_ECHO_STR, res)
- }
- }
- }
- func TestRangePortsMapping(t *testing.T) {
- assert := assert.New(t)
- for i := 0; i < 3; i++ {
- name := fmt.Sprintf("%s_%d", consts.ProxyRangeTCPPrefix, i)
- status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, name)
- if assert.NoError(err) {
- assert.Equal(proxy.ProxyPhaseRunning, status.Status)
- }
- }
- }
- func TestGroup(t *testing.T) {
- assert := assert.New(t)
- var (
- p1 int
- p2 int
- )
- addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP2_FRP_PORT)
- for i := 0; i < 6; i++ {
- res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
- assert.NoError(err)
- switch res {
- case consts.TEST_TCP_ECHO_STR:
- p1++
- case consts.TEST_TCP_ECHO_STR + consts.TEST_TCP_ECHO_STR:
- p2++
- }
- }
- assert.True(p1 > 0 && p2 > 0, "group proxies load balancing")
- }
|