normal_test.go 7.4 KB

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