1
0

func_test.go 9.6 KB

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