func_test.go 7.6 KB

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