normal_test.go 9.9 KB

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