normal_test.go 9.8 KB

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