normal_test.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package ci
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/url"
  6. "os"
  7. "strings"
  8. "testing"
  9. "time"
  10. "github.com/gorilla/websocket"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/fatedier/frp/client/proxy"
  13. "github.com/fatedier/frp/server/ports"
  14. "github.com/fatedier/frp/tests/consts"
  15. "github.com/fatedier/frp/tests/mock"
  16. "github.com/fatedier/frp/tests/util"
  17. gnet "github.com/fatedier/golib/net"
  18. )
  19. func TestMain(m *testing.M) {
  20. var err error
  21. tcpEcho1 := mock.NewEchoServer(consts.TEST_TCP_PORT, 1, "")
  22. tcpEcho2 := mock.NewEchoServer(consts.TEST_TCP2_PORT, 2, "")
  23. if err = tcpEcho1.Start(); err != nil {
  24. panic(err)
  25. }
  26. if err = tcpEcho2.Start(); err != nil {
  27. panic(err)
  28. }
  29. go mock.StartUDPEchoServer(consts.TEST_UDP_PORT)
  30. go mock.StartUnixDomainServer(consts.TEST_UNIX_DOMAIN_ADDR)
  31. go mock.StartHTTPServer(consts.TEST_HTTP_PORT)
  32. p1 := util.NewProcess(consts.FRPS_BIN_PATH, []string{"-c", "./auto_test_frps.ini"})
  33. if err = p1.Start(); err != nil {
  34. panic(err)
  35. }
  36. time.Sleep(500 * time.Millisecond)
  37. p2 := util.NewProcess(consts.FRPC_BIN_PATH, []string{"-c", "./auto_test_frpc.ini"})
  38. if err = p2.Start(); err != nil {
  39. panic(err)
  40. }
  41. p3 := util.NewProcess(consts.FRPC_BIN_PATH, []string{"-c", "./auto_test_frpc_visitor.ini"})
  42. if err = p3.Start(); err != nil {
  43. panic(err)
  44. }
  45. time.Sleep(500 * time.Millisecond)
  46. exitCode := m.Run()
  47. p1.Stop()
  48. p2.Stop()
  49. p3.Stop()
  50. os.Exit(exitCode)
  51. }
  52. func TestHTTP(t *testing.T) {
  53. assert := assert.New(t)
  54. // web01
  55. code, body, _, err := util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "", nil, "")
  56. if assert.NoError(err) {
  57. assert.Equal(200, code)
  58. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  59. }
  60. // web02
  61. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test2.frp.com", nil, "")
  62. if assert.NoError(err) {
  63. assert.Equal(200, code)
  64. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  65. }
  66. // error host header
  67. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "errorhost.frp.com", nil, "")
  68. if assert.NoError(err) {
  69. assert.Equal(404, code)
  70. }
  71. // web03
  72. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
  73. if assert.NoError(err) {
  74. assert.Equal(200, code)
  75. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  76. }
  77. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/foo", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
  78. if assert.NoError(err) {
  79. assert.Equal(200, code)
  80. assert.Equal(consts.TEST_HTTP_FOO_STR, body)
  81. }
  82. // web04
  83. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/bar", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
  84. if assert.NoError(err) {
  85. assert.Equal(200, code)
  86. assert.Equal(consts.TEST_HTTP_BAR_STR, body)
  87. }
  88. // web05
  89. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test5.frp.com", nil, "")
  90. if assert.NoError(err) {
  91. assert.Equal(401, code)
  92. }
  93. headers := make(map[string]string)
  94. headers["Authorization"] = util.BasicAuth("test", "test")
  95. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test5.frp.com", headers, "")
  96. if assert.NoError(err) {
  97. assert.Equal(401, code)
  98. }
  99. // web06
  100. var header http.Header
  101. code, body, header, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test6.frp.com", nil, "")
  102. if assert.NoError(err) {
  103. assert.Equal(200, code)
  104. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  105. assert.Equal("true", header.Get("X-Header-Set"))
  106. }
  107. // wildcard_http
  108. // test.frp1.com match *.frp1.com
  109. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test.frp1.com", nil, "")
  110. if assert.NoError(err) {
  111. assert.Equal(200, code)
  112. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  113. }
  114. // new.test.frp1.com also match *.frp1.com
  115. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "new.test.frp1.com", nil, "")
  116. if assert.NoError(err) {
  117. assert.Equal(200, code)
  118. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  119. }
  120. // subhost01
  121. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test01.sub.com", nil, "")
  122. if assert.NoError(err) {
  123. assert.Equal(200, code)
  124. assert.Equal("test01.sub.com", body)
  125. }
  126. // subhost02
  127. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test02.sub.com", nil, "")
  128. if assert.NoError(err) {
  129. assert.Equal(200, code)
  130. assert.Equal("test02.sub.com", body)
  131. }
  132. }
  133. func TestTCPMux(t *testing.T) {
  134. assert := assert.New(t)
  135. conn, err := gnet.DialTcpByProxy(fmt.Sprintf("http://%s:%d", "127.0.0.1", consts.TEST_TCP_MUX_FRP_PORT), "tunnel1")
  136. if assert.NoError(err) {
  137. res, err := util.SendTCPMsgByConn(conn, consts.TEST_TCP_ECHO_STR)
  138. assert.NoError(err)
  139. assert.Equal(consts.TEST_TCP_ECHO_STR, res)
  140. }
  141. }
  142. func TestWebSocket(t *testing.T) {
  143. assert := assert.New(t)
  144. u := url.URL{Scheme: "ws", Host: fmt.Sprintf("%s:%d", "127.0.0.1", consts.TEST_HTTP_FRP_PORT), Path: "/ws"}
  145. c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
  146. assert.NoError(err)
  147. defer c.Close()
  148. err = c.WriteMessage(websocket.TextMessage, []byte(consts.TEST_HTTP_NORMAL_STR))
  149. assert.NoError(err)
  150. _, msg, err := c.ReadMessage()
  151. assert.NoError(err)
  152. assert.Equal(consts.TEST_HTTP_NORMAL_STR, string(msg))
  153. }
  154. func TestAllowPorts(t *testing.T) {
  155. assert := assert.New(t)
  156. // Port not allowed
  157. status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortNotAllowed)
  158. if assert.NoError(err) {
  159. assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
  160. assert.True(strings.Contains(status.Err, ports.ErrPortNotAllowed.Error()))
  161. }
  162. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPPortNotAllowed)
  163. if assert.NoError(err) {
  164. assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
  165. assert.True(strings.Contains(status.Err, ports.ErrPortNotAllowed.Error()))
  166. }
  167. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortUnavailable)
  168. if assert.NoError(err) {
  169. assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
  170. assert.True(strings.Contains(status.Err, ports.ErrPortUnAvailable.Error()))
  171. }
  172. // Port normal
  173. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortNormal)
  174. if assert.NoError(err) {
  175. assert.Equal(proxy.ProxyPhaseRunning, status.Status)
  176. }
  177. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPPortNormal)
  178. if assert.NoError(err) {
  179. assert.Equal(proxy.ProxyPhaseRunning, status.Status)
  180. }
  181. }
  182. func TestRandomPort(t *testing.T) {
  183. assert := assert.New(t)
  184. // tcp
  185. status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPRandomPort)
  186. if assert.NoError(err) {
  187. addr := status.RemoteAddr
  188. res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
  189. assert.NoError(err)
  190. assert.Equal(consts.TEST_TCP_ECHO_STR, res)
  191. }
  192. // udp
  193. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPRandomPort)
  194. if assert.NoError(err) {
  195. addr := status.RemoteAddr
  196. res, err := util.SendUDPMsg(addr, consts.TEST_UDP_ECHO_STR)
  197. assert.NoError(err)
  198. assert.Equal(consts.TEST_UDP_ECHO_STR, res)
  199. }
  200. }
  201. func TestPluginHTTPProxy(t *testing.T) {
  202. assert := assert.New(t)
  203. status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyHTTPProxy)
  204. if assert.NoError(err) {
  205. assert.Equal(proxy.ProxyPhaseRunning, status.Status)
  206. // http proxy
  207. addr := status.RemoteAddr
  208. code, body, _, err := util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT),
  209. "", nil, "http://"+addr)
  210. if assert.NoError(err) {
  211. assert.Equal(200, code)
  212. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  213. }
  214. // connect method
  215. conn, err := gnet.DialTcpByProxy("http://"+addr, fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP_FRP_PORT))
  216. if assert.NoError(err) {
  217. res, err := util.SendTCPMsgByConn(conn, consts.TEST_TCP_ECHO_STR)
  218. assert.NoError(err)
  219. assert.Equal(consts.TEST_TCP_ECHO_STR, res)
  220. }
  221. }
  222. }
  223. func TestRangePortsMapping(t *testing.T) {
  224. assert := assert.New(t)
  225. for i := 0; i < 3; i++ {
  226. name := fmt.Sprintf("%s_%d", consts.ProxyRangeTCPPrefix, i)
  227. status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, name)
  228. if assert.NoError(err) {
  229. assert.Equal(proxy.ProxyPhaseRunning, status.Status)
  230. }
  231. }
  232. }
  233. func TestGroup(t *testing.T) {
  234. assert := assert.New(t)
  235. var (
  236. p1 int
  237. p2 int
  238. )
  239. addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP2_FRP_PORT)
  240. for i := 0; i < 6; i++ {
  241. res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
  242. assert.NoError(err)
  243. switch res {
  244. case consts.TEST_TCP_ECHO_STR:
  245. p1++
  246. case consts.TEST_TCP_ECHO_STR + consts.TEST_TCP_ECHO_STR:
  247. p2++
  248. }
  249. }
  250. assert.True(p1 > 0 && p2 > 0, "group proxies load balancing")
  251. }