ws_test.go 4.2 KB

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