normal_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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(200 * 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 TestTCP(t *testing.T) {
  53. assert := assert.New(t)
  54. // Normal
  55. addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP_FRP_PORT)
  56. res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
  57. assert.NoError(err)
  58. assert.Equal(consts.TEST_TCP_ECHO_STR, res)
  59. // Encrytion and compression
  60. addr = fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP_EC_FRP_PORT)
  61. res, err = util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
  62. assert.NoError(err)
  63. assert.Equal(consts.TEST_TCP_ECHO_STR, res)
  64. }
  65. func TestUDP(t *testing.T) {
  66. assert := assert.New(t)
  67. // Normal
  68. addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_UDP_FRP_PORT)
  69. res, err := util.SendUDPMsg(addr, consts.TEST_UDP_ECHO_STR)
  70. assert.NoError(err)
  71. assert.Equal(consts.TEST_UDP_ECHO_STR, res)
  72. // Encrytion and compression
  73. addr = fmt.Sprintf("127.0.0.1:%d", consts.TEST_UDP_EC_FRP_PORT)
  74. res, err = util.SendUDPMsg(addr, consts.TEST_UDP_ECHO_STR)
  75. assert.NoError(err)
  76. assert.Equal(consts.TEST_UDP_ECHO_STR, res)
  77. }
  78. func TestUnixDomain(t *testing.T) {
  79. assert := assert.New(t)
  80. // Normal
  81. addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_UNIX_DOMAIN_FRP_PORT)
  82. res, err := util.SendTCPMsg(addr, consts.TEST_UNIX_DOMAIN_STR)
  83. if assert.NoError(err) {
  84. assert.Equal(consts.TEST_UNIX_DOMAIN_STR, res)
  85. }
  86. }
  87. func TestSTCP(t *testing.T) {
  88. assert := assert.New(t)
  89. // Normal
  90. addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_STCP_FRP_PORT)
  91. res, err := util.SendTCPMsg(addr, consts.TEST_STCP_ECHO_STR)
  92. if assert.NoError(err) {
  93. assert.Equal(consts.TEST_STCP_ECHO_STR, res)
  94. }
  95. // Encrytion and compression
  96. addr = fmt.Sprintf("127.0.0.1:%d", consts.TEST_STCP_EC_FRP_PORT)
  97. res, err = util.SendTCPMsg(addr, consts.TEST_STCP_ECHO_STR)
  98. if assert.NoError(err) {
  99. assert.Equal(consts.TEST_STCP_ECHO_STR, res)
  100. }
  101. }
  102. func TestSUDP(t *testing.T) {
  103. assert := assert.New(t)
  104. // Normal
  105. addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_SUDP_FRP_PORT)
  106. res, err := util.SendUDPMsg(addr, consts.TEST_SUDP_ECHO_STR)
  107. assert.NoError(err)
  108. assert.Equal(consts.TEST_SUDP_ECHO_STR, res)
  109. }
  110. func TestHTTP(t *testing.T) {
  111. assert := assert.New(t)
  112. // web01
  113. code, body, _, err := util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "", nil, "")
  114. if assert.NoError(err) {
  115. assert.Equal(200, code)
  116. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  117. }
  118. // web02
  119. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test2.frp.com", nil, "")
  120. if assert.NoError(err) {
  121. assert.Equal(200, code)
  122. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  123. }
  124. // error host header
  125. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "errorhost.frp.com", nil, "")
  126. if assert.NoError(err) {
  127. assert.Equal(404, code)
  128. }
  129. // web03
  130. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
  131. if assert.NoError(err) {
  132. assert.Equal(200, code)
  133. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  134. }
  135. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/foo", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
  136. if assert.NoError(err) {
  137. assert.Equal(200, code)
  138. assert.Equal(consts.TEST_HTTP_FOO_STR, body)
  139. }
  140. // web04
  141. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/bar", consts.TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
  142. if assert.NoError(err) {
  143. assert.Equal(200, code)
  144. assert.Equal(consts.TEST_HTTP_BAR_STR, body)
  145. }
  146. // web05
  147. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test5.frp.com", nil, "")
  148. if assert.NoError(err) {
  149. assert.Equal(401, code)
  150. }
  151. headers := make(map[string]string)
  152. headers["Authorization"] = util.BasicAuth("test", "test")
  153. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test5.frp.com", headers, "")
  154. if assert.NoError(err) {
  155. assert.Equal(401, code)
  156. }
  157. // web06
  158. var header http.Header
  159. code, body, header, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test6.frp.com", nil, "")
  160. if assert.NoError(err) {
  161. assert.Equal(200, code)
  162. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  163. assert.Equal("true", header.Get("X-Header-Set"))
  164. }
  165. // wildcard_http
  166. // test.frp1.com match *.frp1.com
  167. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test.frp1.com", nil, "")
  168. if assert.NoError(err) {
  169. assert.Equal(200, code)
  170. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  171. }
  172. // new.test.frp1.com also match *.frp1.com
  173. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "new.test.frp1.com", nil, "")
  174. if assert.NoError(err) {
  175. assert.Equal(200, code)
  176. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  177. }
  178. // subhost01
  179. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test01.sub.com", nil, "")
  180. if assert.NoError(err) {
  181. assert.Equal(200, code)
  182. assert.Equal("test01.sub.com", body)
  183. }
  184. // subhost02
  185. code, body, _, err = util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT), "test02.sub.com", nil, "")
  186. if assert.NoError(err) {
  187. assert.Equal(200, code)
  188. assert.Equal("test02.sub.com", body)
  189. }
  190. }
  191. func TestTCPMux(t *testing.T) {
  192. assert := assert.New(t)
  193. conn, err := gnet.DialTcpByProxy(fmt.Sprintf("http://%s:%d", "127.0.0.1", consts.TEST_TCP_MUX_FRP_PORT), "tunnel1")
  194. if assert.NoError(err) {
  195. res, err := util.SendTCPMsgByConn(conn, consts.TEST_TCP_ECHO_STR)
  196. assert.NoError(err)
  197. assert.Equal(consts.TEST_TCP_ECHO_STR, res)
  198. }
  199. }
  200. func TestWebSocket(t *testing.T) {
  201. assert := assert.New(t)
  202. u := url.URL{Scheme: "ws", Host: fmt.Sprintf("%s:%d", "127.0.0.1", consts.TEST_HTTP_FRP_PORT), Path: "/ws"}
  203. c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
  204. assert.NoError(err)
  205. defer c.Close()
  206. err = c.WriteMessage(websocket.TextMessage, []byte(consts.TEST_HTTP_NORMAL_STR))
  207. assert.NoError(err)
  208. _, msg, err := c.ReadMessage()
  209. assert.NoError(err)
  210. assert.Equal(consts.TEST_HTTP_NORMAL_STR, string(msg))
  211. }
  212. func TestAllowPorts(t *testing.T) {
  213. assert := assert.New(t)
  214. // Port not allowed
  215. status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortNotAllowed)
  216. if assert.NoError(err) {
  217. assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
  218. assert.True(strings.Contains(status.Err, ports.ErrPortNotAllowed.Error()))
  219. }
  220. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPPortNotAllowed)
  221. if assert.NoError(err) {
  222. assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
  223. assert.True(strings.Contains(status.Err, ports.ErrPortNotAllowed.Error()))
  224. }
  225. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortUnavailable)
  226. if assert.NoError(err) {
  227. assert.Equal(proxy.ProxyPhaseStartErr, status.Status)
  228. assert.True(strings.Contains(status.Err, ports.ErrPortUnAvailable.Error()))
  229. }
  230. // Port normal
  231. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPPortNormal)
  232. if assert.NoError(err) {
  233. assert.Equal(proxy.ProxyPhaseRunning, status.Status)
  234. }
  235. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPPortNormal)
  236. if assert.NoError(err) {
  237. assert.Equal(proxy.ProxyPhaseRunning, status.Status)
  238. }
  239. }
  240. func TestRandomPort(t *testing.T) {
  241. assert := assert.New(t)
  242. // tcp
  243. status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyTCPRandomPort)
  244. if assert.NoError(err) {
  245. addr := status.RemoteAddr
  246. res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
  247. assert.NoError(err)
  248. assert.Equal(consts.TEST_TCP_ECHO_STR, res)
  249. }
  250. // udp
  251. status, err = util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyUDPRandomPort)
  252. if assert.NoError(err) {
  253. addr := status.RemoteAddr
  254. res, err := util.SendUDPMsg(addr, consts.TEST_UDP_ECHO_STR)
  255. assert.NoError(err)
  256. assert.Equal(consts.TEST_UDP_ECHO_STR, res)
  257. }
  258. }
  259. func TestPluginHTTPProxy(t *testing.T) {
  260. assert := assert.New(t)
  261. status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, consts.ProxyHTTPProxy)
  262. if assert.NoError(err) {
  263. assert.Equal(proxy.ProxyPhaseRunning, status.Status)
  264. // http proxy
  265. addr := status.RemoteAddr
  266. code, body, _, err := util.SendHTTPMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", consts.TEST_HTTP_FRP_PORT),
  267. "", nil, "http://"+addr)
  268. if assert.NoError(err) {
  269. assert.Equal(200, code)
  270. assert.Equal(consts.TEST_HTTP_NORMAL_STR, body)
  271. }
  272. // connect method
  273. conn, err := gnet.DialTcpByProxy("http://"+addr, fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP_FRP_PORT))
  274. if assert.NoError(err) {
  275. res, err := util.SendTCPMsgByConn(conn, consts.TEST_TCP_ECHO_STR)
  276. assert.NoError(err)
  277. assert.Equal(consts.TEST_TCP_ECHO_STR, res)
  278. }
  279. }
  280. }
  281. func TestRangePortsMapping(t *testing.T) {
  282. assert := assert.New(t)
  283. for i := 0; i < 3; i++ {
  284. name := fmt.Sprintf("%s_%d", consts.ProxyRangeTCPPrefix, i)
  285. status, err := util.GetProxyStatus(consts.ADMIN_ADDR, consts.ADMIN_USER, consts.ADMIN_PWD, name)
  286. if assert.NoError(err) {
  287. assert.Equal(proxy.ProxyPhaseRunning, status.Status)
  288. }
  289. }
  290. }
  291. func TestGroup(t *testing.T) {
  292. assert := assert.New(t)
  293. var (
  294. p1 int
  295. p2 int
  296. )
  297. addr := fmt.Sprintf("127.0.0.1:%d", consts.TEST_TCP2_FRP_PORT)
  298. for i := 0; i < 6; i++ {
  299. res, err := util.SendTCPMsg(addr, consts.TEST_TCP_ECHO_STR)
  300. assert.NoError(err)
  301. switch res {
  302. case consts.TEST_TCP_ECHO_STR:
  303. p1++
  304. case consts.TEST_TCP_ECHO_STR + consts.TEST_TCP_ECHO_STR:
  305. p2++
  306. }
  307. }
  308. assert.True(p1 > 0 && p2 > 0, "group proxies load balancing")
  309. }