func_test.go 6.6 KB

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