ws_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package websocket_test
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "time"
  8. "bytes"
  9. v2net "v2ray.com/core/common/net"
  10. "v2ray.com/core/common/serial"
  11. "v2ray.com/core/testing/assert"
  12. "v2ray.com/core/transport/internet"
  13. v2tls "v2ray.com/core/transport/internet/tls"
  14. . "v2ray.com/core/transport/internet/websocket"
  15. )
  16. func Test_listenWSAndDial(t *testing.T) {
  17. assert := assert.On(t)
  18. listen, err := ListenWS(v2net.DomainAddress("localhost"), 13146, internet.ListenOptions{
  19. Stream: &internet.StreamConfig{
  20. Protocol: internet.TransportProtocol_WebSocket,
  21. TransportSettings: []*internet.TransportSettings{
  22. {
  23. Protocol: internet.TransportProtocol_WebSocket,
  24. Settings: serial.ToTypedMessage(&Config{
  25. Path: "ws",
  26. }),
  27. },
  28. },
  29. },
  30. })
  31. assert.Error(err).IsNil()
  32. go func() {
  33. for {
  34. conn, err := listen.Accept()
  35. if err != nil {
  36. break
  37. }
  38. go func() {
  39. defer conn.Close()
  40. var b [1024]byte
  41. n, err := conn.Read(b[:])
  42. //assert.Error(err).IsNil()
  43. if err != nil {
  44. conn.SetReusable(false)
  45. return
  46. }
  47. assert.Bool(bytes.HasPrefix(b[:n], []byte("Test connection"))).IsTrue()
  48. _, err = conn.Write([]byte("Response"))
  49. assert.Error(err).IsNil()
  50. }()
  51. }
  52. }()
  53. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
  54. Stream: &internet.StreamConfig{
  55. Protocol: internet.TransportProtocol_WebSocket,
  56. TransportSettings: []*internet.TransportSettings{
  57. {
  58. Protocol: internet.TransportProtocol_WebSocket,
  59. Settings: serial.ToTypedMessage(&Config{
  60. Path: "ws",
  61. }),
  62. },
  63. },
  64. },
  65. })
  66. assert.Error(err).IsNil()
  67. _, err = conn.Write([]byte("Test connection 1"))
  68. assert.Error(err).IsNil()
  69. var b [1024]byte
  70. n, err := conn.Read(b[:])
  71. assert.Error(err).IsNil()
  72. assert.String(string(b[:n])).Equals("Response")
  73. assert.Error(conn.Close()).IsNil()
  74. <-time.After(time.Second * 5)
  75. conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
  76. Stream: &internet.StreamConfig{
  77. Protocol: internet.TransportProtocol_WebSocket,
  78. TransportSettings: []*internet.TransportSettings{
  79. {
  80. Protocol: internet.TransportProtocol_WebSocket,
  81. Settings: serial.ToTypedMessage(&Config{
  82. Path: "ws",
  83. }),
  84. },
  85. },
  86. },
  87. })
  88. assert.Error(err).IsNil()
  89. _, err = conn.Write([]byte("Test connection 2"))
  90. assert.Error(err).IsNil()
  91. n, err = conn.Read(b[:])
  92. assert.Error(err).IsNil()
  93. assert.String(string(b[:n])).Equals("Response")
  94. assert.Error(conn.Close()).IsNil()
  95. <-time.After(time.Second * 15)
  96. conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
  97. Stream: &internet.StreamConfig{
  98. Protocol: internet.TransportProtocol_WebSocket,
  99. TransportSettings: []*internet.TransportSettings{
  100. {
  101. Protocol: internet.TransportProtocol_WebSocket,
  102. Settings: serial.ToTypedMessage(&Config{
  103. Path: "ws",
  104. }),
  105. },
  106. },
  107. },
  108. })
  109. assert.Error(err).IsNil()
  110. _, err = conn.Write([]byte("Test connection 3"))
  111. assert.Error(err).IsNil()
  112. n, err = conn.Read(b[:])
  113. assert.Error(err).IsNil()
  114. assert.String(string(b[:n])).Equals("Response")
  115. assert.Error(conn.Close()).IsNil()
  116. assert.Error(listen.Close()).IsNil()
  117. }
  118. func Test_listenWSAndDial_TLS(t *testing.T) {
  119. assert := assert.On(t)
  120. go func() {
  121. <-time.After(time.Second * 5)
  122. assert.Fail("Too slow")
  123. }()
  124. tlsSettings := &v2tls.Config{
  125. AllowInsecure: true,
  126. Certificate: []*v2tls.Certificate{
  127. {
  128. Certificate: ReadFile(filepath.Join(os.Getenv("GOPATH"), "src", "v2ray.com", "core", "testing", "tls", "cert.pem"), assert),
  129. Key: ReadFile(filepath.Join(os.Getenv("GOPATH"), "src", "v2ray.com", "core", "testing", "tls", "key.pem"), assert),
  130. },
  131. },
  132. }
  133. listen, err := ListenWS(v2net.DomainAddress("localhost"), 13143, internet.ListenOptions{
  134. Stream: &internet.StreamConfig{
  135. SecurityType: serial.GetMessageType(new(v2tls.Config)),
  136. SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(tlsSettings)},
  137. Protocol: internet.TransportProtocol_WebSocket,
  138. TransportSettings: []*internet.TransportSettings{
  139. {
  140. Protocol: internet.TransportProtocol_WebSocket,
  141. Settings: serial.ToTypedMessage(&Config{
  142. Path: "wss",
  143. ConnectionReuse: &ConnectionReuse{
  144. Enable: true,
  145. },
  146. }),
  147. },
  148. },
  149. },
  150. })
  151. assert.Error(err).IsNil()
  152. go func() {
  153. conn, err := listen.Accept()
  154. assert.Error(err).IsNil()
  155. conn.Close()
  156. listen.Close()
  157. }()
  158. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13143), internet.DialerOptions{
  159. Stream: &internet.StreamConfig{
  160. SecurityType: serial.GetMessageType(new(v2tls.Config)),
  161. SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(tlsSettings)},
  162. Protocol: internet.TransportProtocol_WebSocket,
  163. TransportSettings: []*internet.TransportSettings{
  164. {
  165. Protocol: internet.TransportProtocol_WebSocket,
  166. Settings: serial.ToTypedMessage(&Config{
  167. Path: "wss",
  168. ConnectionReuse: &ConnectionReuse{
  169. Enable: true,
  170. },
  171. }),
  172. },
  173. },
  174. },
  175. })
  176. assert.Error(err).IsNil()
  177. conn.Close()
  178. }
  179. func ReadFile(file string, assert *assert.Assert) []byte {
  180. b, err := ioutil.ReadFile(file)
  181. assert.Error(err).IsNil()
  182. return b
  183. }