func_test.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. package tests
  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"
  13. gnet "github.com/fatedier/golib/net"
  14. )
  15. var (
  16. SERVER_ADDR = "127.0.0.1"
  17. ADMIN_ADDR = "127.0.0.1:10600"
  18. ADMIN_USER = "abc"
  19. ADMIN_PWD = "abc"
  20. TEST_STR = "frp is a fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet."
  21. TEST_TCP_PORT int = 10701
  22. TEST_TCP_FRP_PORT int = 10801
  23. TEST_TCP_EC_FRP_PORT int = 10901
  24. TEST_TCP_ECHO_STR string = "tcp type:" + TEST_STR
  25. TEST_UDP_PORT int = 10702
  26. TEST_UDP_FRP_PORT int = 10802
  27. TEST_UDP_EC_FRP_PORT int = 10902
  28. TEST_UDP_ECHO_STR string = "udp type:" + TEST_STR
  29. TEST_UNIX_DOMAIN_ADDR string = "/tmp/frp_echo_server.sock"
  30. TEST_UNIX_DOMAIN_FRP_PORT int = 10803
  31. TEST_UNIX_DOMAIN_STR string = "unix domain type:" + TEST_STR
  32. TEST_HTTP_PORT int = 10704
  33. TEST_HTTP_FRP_PORT int = 10804
  34. TEST_HTTP_NORMAL_STR string = "http normal string: " + TEST_STR
  35. TEST_HTTP_FOO_STR string = "http foo string: " + TEST_STR
  36. TEST_HTTP_BAR_STR string = "http bar string: " + TEST_STR
  37. TEST_STCP_FRP_PORT int = 10805
  38. TEST_STCP_EC_FRP_PORT int = 10905
  39. TEST_STCP_ECHO_STR string = "stcp type:" + TEST_STR
  40. ProxyTcpPortNotAllowed string = "tcp_port_not_allowed"
  41. ProxyTcpPortUnavailable string = "tcp_port_unavailable"
  42. ProxyTcpPortNormal string = "tcp_port_normal"
  43. ProxyTcpRandomPort string = "tcp_random_port"
  44. ProxyUdpPortNotAllowed string = "udp_port_not_allowed"
  45. ProxyUdpPortNormal string = "udp_port_normal"
  46. ProxyUdpRandomPort string = "udp_random_port"
  47. ProxyHttpProxy string = "http_proxy"
  48. ProxyRangeTcpPrefix string = "range_tcp"
  49. )
  50. func init() {
  51. go StartTcpEchoServer()
  52. go StartUdpEchoServer()
  53. go StartUnixDomainServer()
  54. go StartHttpServer()
  55. time.Sleep(500 * time.Millisecond)
  56. }
  57. func TestTcp(t *testing.T) {
  58. assert := assert.New(t)
  59. // Normal
  60. addr := fmt.Sprintf("127.0.0.1:%d", TEST_TCP_FRP_PORT)
  61. res, err := sendTcpMsg(addr, TEST_TCP_ECHO_STR)
  62. assert.NoError(err)
  63. assert.Equal(TEST_TCP_ECHO_STR, res)
  64. // Encrytion and compression
  65. addr = fmt.Sprintf("127.0.0.1:%d", TEST_TCP_EC_FRP_PORT)
  66. res, err = sendTcpMsg(addr, TEST_TCP_ECHO_STR)
  67. assert.NoError(err)
  68. assert.Equal(TEST_TCP_ECHO_STR, res)
  69. }
  70. func TestUdp(t *testing.T) {
  71. assert := assert.New(t)
  72. // Normal
  73. addr := fmt.Sprintf("127.0.0.1:%d", TEST_UDP_FRP_PORT)
  74. res, err := sendUdpMsg(addr, TEST_UDP_ECHO_STR)
  75. assert.NoError(err)
  76. assert.Equal(TEST_UDP_ECHO_STR, res)
  77. // Encrytion and compression
  78. addr = fmt.Sprintf("127.0.0.1:%d", TEST_UDP_EC_FRP_PORT)
  79. res, err = sendUdpMsg(addr, TEST_UDP_ECHO_STR)
  80. assert.NoError(err)
  81. assert.Equal(TEST_UDP_ECHO_STR, res)
  82. }
  83. func TestUnixDomain(t *testing.T) {
  84. assert := assert.New(t)
  85. // Normal
  86. addr := fmt.Sprintf("127.0.0.1:%d", TEST_UNIX_DOMAIN_FRP_PORT)
  87. res, err := sendTcpMsg(addr, TEST_UNIX_DOMAIN_STR)
  88. if assert.NoError(err) {
  89. assert.Equal(TEST_UNIX_DOMAIN_STR, res)
  90. }
  91. }
  92. func TestStcp(t *testing.T) {
  93. assert := assert.New(t)
  94. // Normal
  95. addr := fmt.Sprintf("127.0.0.1:%d", TEST_STCP_FRP_PORT)
  96. res, err := sendTcpMsg(addr, TEST_STCP_ECHO_STR)
  97. if assert.NoError(err) {
  98. assert.Equal(TEST_STCP_ECHO_STR, res)
  99. }
  100. // Encrytion and compression
  101. addr = fmt.Sprintf("127.0.0.1:%d", TEST_STCP_EC_FRP_PORT)
  102. res, err = sendTcpMsg(addr, TEST_STCP_ECHO_STR)
  103. if assert.NoError(err) {
  104. assert.Equal(TEST_STCP_ECHO_STR, res)
  105. }
  106. }
  107. func TestHttp(t *testing.T) {
  108. assert := assert.New(t)
  109. // web01
  110. code, body, _, err := sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT), "", nil, "")
  111. if assert.NoError(err) {
  112. assert.Equal(200, code)
  113. assert.Equal(TEST_HTTP_NORMAL_STR, body)
  114. }
  115. // web02
  116. code, body, _, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT), "test2.frp.com", nil, "")
  117. if assert.NoError(err) {
  118. assert.Equal(200, code)
  119. assert.Equal(TEST_HTTP_NORMAL_STR, body)
  120. }
  121. // error host header
  122. code, body, _, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT), "errorhost.frp.com", nil, "")
  123. if assert.NoError(err) {
  124. assert.Equal(404, code)
  125. }
  126. // web03
  127. code, body, _, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
  128. if assert.NoError(err) {
  129. assert.Equal(200, code)
  130. assert.Equal(TEST_HTTP_NORMAL_STR, body)
  131. }
  132. code, body, _, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/foo", TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
  133. if assert.NoError(err) {
  134. assert.Equal(200, code)
  135. assert.Equal(TEST_HTTP_FOO_STR, body)
  136. }
  137. // web04
  138. code, body, _, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d/bar", TEST_HTTP_FRP_PORT), "test3.frp.com", nil, "")
  139. if assert.NoError(err) {
  140. assert.Equal(200, code)
  141. assert.Equal(TEST_HTTP_BAR_STR, body)
  142. }
  143. // web05
  144. code, body, _, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT), "test5.frp.com", nil, "")
  145. if assert.NoError(err) {
  146. assert.Equal(401, code)
  147. }
  148. headers := make(map[string]string)
  149. headers["Authorization"] = basicAuth("test", "test")
  150. code, body, _, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT), "test5.frp.com", headers, "")
  151. if assert.NoError(err) {
  152. assert.Equal(401, code)
  153. }
  154. // web06
  155. var header http.Header
  156. code, body, header, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT), "test6.frp.com", nil, "")
  157. if assert.NoError(err) {
  158. assert.Equal(200, code)
  159. assert.Equal(TEST_HTTP_NORMAL_STR, body)
  160. assert.Equal("true", header.Get("X-Header-Set"))
  161. }
  162. // subhost01
  163. code, body, _, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT), "test01.sub.com", nil, "")
  164. if assert.NoError(err) {
  165. assert.Equal(200, code)
  166. assert.Equal("test01.sub.com", body)
  167. }
  168. // subhost02
  169. code, body, _, err = sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT), "test02.sub.com", nil, "")
  170. if assert.NoError(err) {
  171. assert.Equal(200, code)
  172. assert.Equal("test02.sub.com", body)
  173. }
  174. }
  175. func TestWebSocket(t *testing.T) {
  176. assert := assert.New(t)
  177. u := url.URL{Scheme: "ws", Host: fmt.Sprintf("%s:%d", "127.0.0.1", TEST_HTTP_FRP_PORT), Path: "/ws"}
  178. c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
  179. assert.NoError(err)
  180. defer c.Close()
  181. err = c.WriteMessage(websocket.TextMessage, []byte(TEST_HTTP_NORMAL_STR))
  182. assert.NoError(err)
  183. _, msg, err := c.ReadMessage()
  184. assert.NoError(err)
  185. assert.Equal(TEST_HTTP_NORMAL_STR, string(msg))
  186. }
  187. func TestAllowPorts(t *testing.T) {
  188. assert := assert.New(t)
  189. // Port not allowed
  190. status, err := getProxyStatus(ProxyTcpPortNotAllowed)
  191. if assert.NoError(err) {
  192. assert.Equal(client.ProxyStatusStartErr, status.Status)
  193. assert.True(strings.Contains(status.Err, server.ErrPortNotAllowed.Error()))
  194. }
  195. status, err = getProxyStatus(ProxyUdpPortNotAllowed)
  196. if assert.NoError(err) {
  197. assert.Equal(client.ProxyStatusStartErr, status.Status)
  198. assert.True(strings.Contains(status.Err, server.ErrPortNotAllowed.Error()))
  199. }
  200. status, err = getProxyStatus(ProxyTcpPortUnavailable)
  201. if assert.NoError(err) {
  202. assert.Equal(client.ProxyStatusStartErr, status.Status)
  203. assert.True(strings.Contains(status.Err, server.ErrPortUnAvailable.Error()))
  204. }
  205. // Port normal
  206. status, err = getProxyStatus(ProxyTcpPortNormal)
  207. if assert.NoError(err) {
  208. assert.Equal(client.ProxyStatusRunning, status.Status)
  209. }
  210. status, err = getProxyStatus(ProxyUdpPortNormal)
  211. if assert.NoError(err) {
  212. assert.Equal(client.ProxyStatusRunning, status.Status)
  213. }
  214. }
  215. func TestRandomPort(t *testing.T) {
  216. assert := assert.New(t)
  217. // tcp
  218. status, err := getProxyStatus(ProxyTcpRandomPort)
  219. if assert.NoError(err) {
  220. addr := status.RemoteAddr
  221. res, err := sendTcpMsg(addr, TEST_TCP_ECHO_STR)
  222. assert.NoError(err)
  223. assert.Equal(TEST_TCP_ECHO_STR, res)
  224. }
  225. // udp
  226. status, err = getProxyStatus(ProxyUdpRandomPort)
  227. if assert.NoError(err) {
  228. addr := status.RemoteAddr
  229. res, err := sendUdpMsg(addr, TEST_UDP_ECHO_STR)
  230. assert.NoError(err)
  231. assert.Equal(TEST_UDP_ECHO_STR, res)
  232. }
  233. }
  234. func TestPluginHttpProxy(t *testing.T) {
  235. assert := assert.New(t)
  236. status, err := getProxyStatus(ProxyHttpProxy)
  237. if assert.NoError(err) {
  238. assert.Equal(client.ProxyStatusRunning, status.Status)
  239. // http proxy
  240. addr := status.RemoteAddr
  241. code, body, _, err := sendHttpMsg("GET", fmt.Sprintf("http://127.0.0.1:%d", TEST_HTTP_FRP_PORT),
  242. "", nil, "http://"+addr)
  243. if assert.NoError(err) {
  244. assert.Equal(200, code)
  245. assert.Equal(TEST_HTTP_NORMAL_STR, body)
  246. }
  247. // connect method
  248. conn, err := gnet.DialTcpByProxy("http://"+addr, fmt.Sprintf("127.0.0.1:%d", TEST_TCP_FRP_PORT))
  249. if assert.NoError(err) {
  250. res, err := sendTcpMsgByConn(conn, TEST_TCP_ECHO_STR)
  251. assert.NoError(err)
  252. assert.Equal(TEST_TCP_ECHO_STR, res)
  253. }
  254. }
  255. }
  256. func TestRangePortsMapping(t *testing.T) {
  257. assert := assert.New(t)
  258. for i := 0; i < 3; i++ {
  259. name := fmt.Sprintf("%s_%d", ProxyRangeTcpPrefix, i)
  260. status, err := getProxyStatus(name)
  261. if assert.NoError(err) {
  262. assert.Equal(client.ProxyStatusRunning, status.Status)
  263. }
  264. }
  265. }