ws_test.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package ws_test
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/v2ray/v2ray-core/testing/assert"
  6. . "github.com/v2ray/v2ray-core/transport/internet/ws"
  7. v2net "github.com/v2ray/v2ray-core/common/net"
  8. )
  9. func Test_Connect_ws(t *testing.T) {
  10. assert := assert.On(t)
  11. (&Config{Pto: "ws", Path: ""}).Apply()
  12. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 80))
  13. assert.Error(err).IsNil()
  14. conn.Write([]byte("echo"))
  15. s := make(chan int)
  16. go func() {
  17. buf := make([]byte, 4)
  18. conn.Read(buf)
  19. str := string(buf)
  20. if str != "echo" {
  21. assert.Fail("Data mismatch")
  22. }
  23. s <- 0
  24. }()
  25. <-s
  26. conn.Close()
  27. }
  28. func Test_Connect_wss(t *testing.T) {
  29. assert := assert.On(t)
  30. (&Config{Pto: "wss", Path: ""}).Apply()
  31. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443))
  32. assert.Error(err).IsNil()
  33. conn.Write([]byte("echo"))
  34. s := make(chan int)
  35. go func() {
  36. buf := make([]byte, 4)
  37. conn.Read(buf)
  38. str := string(buf)
  39. if str != "echo" {
  40. assert.Fail("Data mismatch")
  41. }
  42. s <- 0
  43. }()
  44. <-s
  45. conn.Close()
  46. }
  47. func Test_Connect_wss_1_nil(t *testing.T) {
  48. assert := assert.On(t)
  49. (&Config{Pto: "wss", Path: ""}).Apply()
  50. conn, err := Dial(nil, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443))
  51. assert.Error(err).IsNil()
  52. conn.Write([]byte("echo"))
  53. s := make(chan int)
  54. go func() {
  55. buf := make([]byte, 4)
  56. conn.Read(buf)
  57. str := string(buf)
  58. if str != "echo" {
  59. assert.Fail("Data mismatch")
  60. }
  61. s <- 0
  62. }()
  63. <-s
  64. conn.Close()
  65. }
  66. func Test_Connect_ws_guess(t *testing.T) {
  67. assert := assert.On(t)
  68. (&Config{Pto: "", Path: ""}).Apply()
  69. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 80))
  70. assert.Error(err).IsNil()
  71. conn.Write([]byte("echo"))
  72. s := make(chan int)
  73. go func() {
  74. buf := make([]byte, 4)
  75. conn.Read(buf)
  76. str := string(buf)
  77. if str != "echo" {
  78. assert.Fail("Data mismatch")
  79. }
  80. s <- 0
  81. }()
  82. <-s
  83. conn.Close()
  84. }
  85. func Test_Connect_wss_guess(t *testing.T) {
  86. assert := assert.On(t)
  87. (&Config{Pto: "", Path: ""}).Apply()
  88. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443))
  89. assert.Error(err).IsNil()
  90. conn.Write([]byte("echo"))
  91. s := make(chan int)
  92. go func() {
  93. buf := make([]byte, 4)
  94. conn.Read(buf)
  95. str := string(buf)
  96. if str != "echo" {
  97. assert.Fail("Data mismatch")
  98. }
  99. s <- 0
  100. }()
  101. <-s
  102. conn.Close()
  103. }
  104. func Test_Connect_wss_guess_fail(t *testing.T) {
  105. assert := assert.On(t)
  106. (&Config{Pto: "", Path: ""}).Apply()
  107. _, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("static.kkdev.org"), 443))
  108. assert.Error(err).IsNotNil()
  109. }
  110. func Test_Connect_wss_guess_fail_port(t *testing.T) {
  111. assert := assert.On(t)
  112. (&Config{Pto: "", Path: ""}).Apply()
  113. _, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("static.kkdev.org"), 179))
  114. assert.Error(err).IsNotNil()
  115. }
  116. func Test_Connect_wss_guess_reuse(t *testing.T) {
  117. assert := assert.On(t)
  118. (&Config{Pto: "", Path: "", ConnectionReuse: true}).Apply()
  119. i := 3
  120. for i != 0 {
  121. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443))
  122. assert.Error(err).IsNil()
  123. conn.Write([]byte("echo"))
  124. s := make(chan int)
  125. go func() {
  126. buf := make([]byte, 4)
  127. conn.Read(buf)
  128. str := string(buf)
  129. if str != "echo" {
  130. assert.Fail("Data mismatch")
  131. }
  132. s <- 0
  133. }()
  134. <-s
  135. if i == 0 {
  136. conn.SetDeadline(time.Now())
  137. conn.SetReadDeadline(time.Now())
  138. conn.SetWriteDeadline(time.Now())
  139. conn.SetReusable(false)
  140. }
  141. conn.Close()
  142. i--
  143. }
  144. }
  145. func Test_listenWSAndDial(t *testing.T) {
  146. assert := assert.On(t)
  147. (&Config{Pto: "ws", Path: "ws"}).Apply()
  148. listen, err := ListenWS(v2net.DomainAddress("localhost"), 13142)
  149. assert.Error(err).IsNil()
  150. go func() {
  151. conn, err := listen.Accept()
  152. assert.Error(err).IsNil()
  153. conn.Close()
  154. conn, err = listen.Accept()
  155. assert.Error(err).IsNil()
  156. conn.Close()
  157. conn, err = listen.Accept()
  158. assert.Error(err).IsNil()
  159. conn.Close()
  160. listen.Close()
  161. }()
  162. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13142))
  163. assert.Error(err).IsNil()
  164. conn.Close()
  165. <-time.After(time.Second * 5)
  166. conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13142))
  167. assert.Error(err).IsNil()
  168. conn.Close()
  169. <-time.After(time.Second * 15)
  170. conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13142))
  171. assert.Error(err).IsNil()
  172. conn.Close()
  173. }
  174. func Test_listenWSAndDial_TLS(t *testing.T) {
  175. assert := assert.On(t)
  176. go func() {
  177. <-time.After(time.Second * 5)
  178. assert.Fail("Too slow")
  179. }()
  180. (&Config{Pto: "wss", Path: "wss", ConnectionReuse: true, DeveloperInsecureSkipVerify: true, PrivKey: "./../../../testing/tls/key.pem", Cert: "./../../../testing/tls/cert.pem"}).Apply()
  181. listen, err := ListenWS(v2net.DomainAddress("localhost"), 13143)
  182. assert.Error(err).IsNil()
  183. go func() {
  184. conn, err := listen.Accept()
  185. assert.Error(err).IsNil()
  186. conn.Close()
  187. listen.Close()
  188. }()
  189. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13143))
  190. assert.Error(err).IsNil()
  191. conn.Close()
  192. }