2017-09-25 03:24:38 +03:00
|
|
|
package wsplice
|
|
|
|
|
2017-10-01 22:56:48 +03:00
|
|
|
import (
|
2017-10-01 23:22:30 +03:00
|
|
|
"crypto/rand"
|
2017-10-01 22:56:48 +03:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
2017-09-25 03:24:38 +03:00
|
|
|
|
|
|
|
func (e *EndToEndSuite) TestErrorsSendingToNonexistentConnection() {
|
|
|
|
cnx := e.connectSocket()
|
|
|
|
e.write(cnx, 0, `{"hello":"world!"}`)
|
|
|
|
e.expectRead(cnx, 0xffff, `{"id":0,"type":"method","method":"warn","params":{"code":4004,`+
|
|
|
|
`"message":"You are trying to send to a connection which does not exist"}}`)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *EndToEndSuite) TestPingPong() {
|
|
|
|
url := e.makeServer(echo)
|
|
|
|
cnx := e.connectSocket()
|
|
|
|
|
|
|
|
e.write(cnx, 0xffff, `{"type":"method","method":"connect","params":{"url":"`+url+`"}}`)
|
|
|
|
e.expectRead(cnx, 0xffff, `{"id":0,"type":"reply","result":{"index":0}}`)
|
|
|
|
e.write(cnx, 0, `{"hello":"world!"}`)
|
|
|
|
e.expectRead(cnx, 0, `{"hello":"world!"}`)
|
|
|
|
|
|
|
|
e.servers[0].Close()
|
|
|
|
e.expectRead(cnx, 0xffff, `{"id":0,"type":"method","method":"onSocketClosed","params":{"code":1001,"reason":"","index":0}}`)
|
|
|
|
}
|
|
|
|
|
2017-10-01 22:56:48 +03:00
|
|
|
func (e *EndToEndSuite) TestHandlesFragmentedMessages() {
|
|
|
|
url := e.makeServer(echo)
|
|
|
|
cnx := e.connectSocket()
|
|
|
|
|
|
|
|
// Gorilla fragments messages at 64kb, a 400kb message will be split up.
|
|
|
|
// Make sure it can ping and pong!
|
|
|
|
data := make([]byte, 1024*400)
|
|
|
|
_, err := rand.Read(data)
|
|
|
|
require.Nil(e.T(), err)
|
|
|
|
|
|
|
|
e.write(cnx, 0xffff, `{"type":"method","method":"connect","params":{"url":"`+url+`"}}`)
|
|
|
|
e.expectRead(cnx, 0xffff, `{"id":0,"type":"reply","result":{"index":0}}`)
|
|
|
|
e.write(cnx, 0, string(data))
|
|
|
|
e.expectRead(cnx, 0, string(data))
|
|
|
|
}
|
|
|
|
|
2017-09-25 03:24:38 +03:00
|
|
|
func (e *EndToEndSuite) TestDisallowsHostsNotOnList() {
|
|
|
|
e.makeServer(echo)
|
|
|
|
cnx := e.connectSocket()
|
|
|
|
e.write(cnx, 0xffff, `{"type":"method","method":"connect","params":{"url":"wss://example.com"}}`)
|
|
|
|
e.expectRead(cnx, 0xffff, `{"id":0,"type":"reply","error":{"code":4007,"message":`+
|
|
|
|
`"You are not allowd to connect to that hostname","path":"url"}}`)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *EndToEndSuite) TestDisallowsTooLargeFrames() {
|
|
|
|
e.makeServer(echo)
|
|
|
|
cnx := e.connectSocket()
|
2017-10-01 23:22:30 +03:00
|
|
|
e.expectWriteError(cnx, 0xffff, `{"method":"`+strings.Repeat("hello", 1024*1024)+`"}`, "write")
|
2017-09-25 03:24:38 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
func (e *EndToEndSuite) TestMultiplexes() {
|
|
|
|
url1 := e.makeServer(forever(echo))
|
|
|
|
url2 := e.makeServer(forever(yell))
|
|
|
|
cnx := e.connectSocket()
|
|
|
|
|
|
|
|
e.write(cnx, 0xffff, `{"id":1,"type":"method","method":"connect","params":{"url":"`+url1+`"}}`)
|
|
|
|
e.expectRead(cnx, 0xffff, `{"id":1,"type":"reply","result":{"index":0}}`)
|
|
|
|
e.write(cnx, 0xffff, `{"id":2,"type":"method","method":"connect","params":{"url":"`+url2+`"}}`)
|
|
|
|
e.expectRead(cnx, 0xffff, `{"id":2,"type":"reply","result":{"index":1}}`)
|
|
|
|
|
|
|
|
e.write(cnx, 0, `{"hello":"world!"}`)
|
|
|
|
e.expectRead(cnx, 0, `{"hello":"world!"}`)
|
|
|
|
|
|
|
|
e.write(cnx, 1, `{"hello":"world!"}`)
|
|
|
|
e.expectRead(cnx, 1, `{"HELLO":"WORLD!"}`)
|
|
|
|
}
|