nmdc-webfrontend/vendor/github.com/googollee/go-engine.io/polling/polling_test.go

232 lines
5.0 KiB
Go

package polling
import (
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
"github.com/googollee/go-engine.io/message"
"github.com/googollee/go-engine.io/parser"
"github.com/googollee/go-engine.io/transport"
. "github.com/smartystreets/goconvey/convey"
)
func TestPolling(t *testing.T) {
Convey("Normal", t, func() {
s := newServer()
server := httptest.NewServer(s)
defer server.Close()
req, err := http.NewRequest("GET", server.URL, nil)
So(err, ShouldBeNil)
client, err := NewClient(req)
So(err, ShouldBeNil)
So(client.Response(), ShouldBeNil)
sync := make(chan int)
go func() {
<-s.callback.onPacket
sync <- 1
}()
{
w, err := client.NextWriter(message.MessageBinary, parser.MESSAGE)
So(err, ShouldBeNil)
_, err = w.Write([]byte("123"))
So(err, ShouldBeNil)
err = w.Close()
So(err, ShouldBeNil)
}
{
<-sync
So(s.callback.messageType, ShouldEqual, message.MessageBinary)
So(s.callback.packetType, ShouldEqual, parser.MESSAGE)
So(s.callback.body, ShouldResemble, []byte("123"))
}
So(client.Response(), ShouldNotBeNil)
So(client.Response().StatusCode, ShouldEqual, http.StatusOK)
So(client.Response().Header.Get("Custom"), ShouldEqual, "value")
{
w, err := s.server.NextWriter(message.MessageText, parser.MESSAGE)
So(err, ShouldBeNil)
_, err = w.Write([]byte("abc1"))
So(err, ShouldBeNil)
err = w.Close()
So(err, ShouldBeNil)
w, err = s.server.NextWriter(message.MessageText, parser.MESSAGE)
So(err, ShouldBeNil)
_, err = w.Write([]byte("abc2"))
So(err, ShouldBeNil)
err = w.Close()
So(err, ShouldBeNil)
}
{
r, err := client.NextReader()
So(err, ShouldBeNil)
b, err := ioutil.ReadAll(r)
So(err, ShouldBeNil)
So(b, ShouldResemble, []byte("abc1"))
err = r.Close()
So(err, ShouldBeNil)
r, err = client.NextReader()
So(err, ShouldBeNil)
b, err = ioutil.ReadAll(r)
So(err, ShouldBeNil)
So(b, ShouldResemble, []byte("abc2"))
err = r.Close()
So(err, ShouldBeNil)
}
{
w, err := s.server.NextWriter(message.MessageText, parser.MESSAGE)
So(err, ShouldBeNil)
_, err = w.Write([]byte("abc"))
So(err, ShouldBeNil)
err = w.Close()
So(err, ShouldBeNil)
}
{
r, err := client.NextReader()
So(err, ShouldBeNil)
b, err := ioutil.ReadAll(r)
So(err, ShouldBeNil)
So(b, ShouldResemble, []byte("abc"))
err = r.Close()
So(err, ShouldBeNil)
}
client.Close()
})
Convey("Normal b64", t, func() {
s := newServer()
server := httptest.NewServer(s)
defer server.Close()
req, err := http.NewRequest("GET", server.URL+"?b64", nil)
So(err, ShouldBeNil)
client, err := NewClient(req)
So(err, ShouldBeNil)
So(client.Response(), ShouldBeNil)
sync := make(chan int)
go func() {
<-s.callback.onPacket
sync <- 1
}()
{
w, err := client.NextWriter(message.MessageBinary, parser.MESSAGE)
So(err, ShouldBeNil)
_, err = w.Write([]byte("123"))
So(err, ShouldBeNil)
err = w.Close()
So(err, ShouldBeNil)
}
{
<-sync
So(s.callback.messageType, ShouldEqual, message.MessageBinary)
So(s.callback.packetType, ShouldEqual, parser.MESSAGE)
So(s.callback.body, ShouldResemble, []byte("123"))
}
So(client.Response(), ShouldNotBeNil)
So(client.Response().StatusCode, ShouldEqual, http.StatusOK)
So(client.Response().Header.Get("Custom"), ShouldEqual, "value")
{
w, err := s.server.NextWriter(message.MessageText, parser.MESSAGE)
So(err, ShouldBeNil)
_, err = w.Write([]byte("abc1"))
So(err, ShouldBeNil)
err = w.Close()
So(err, ShouldBeNil)
w, err = s.server.NextWriter(message.MessageText, parser.MESSAGE)
So(err, ShouldBeNil)
_, err = w.Write([]byte("abc2"))
So(err, ShouldBeNil)
err = w.Close()
So(err, ShouldBeNil)
}
{
r, err := client.NextReader()
So(err, ShouldBeNil)
b, err := ioutil.ReadAll(r)
So(err, ShouldBeNil)
So(b, ShouldResemble, []byte("abc1"))
err = r.Close()
So(err, ShouldBeNil)
r, err = client.NextReader()
So(err, ShouldBeNil)
b, err = ioutil.ReadAll(r)
So(err, ShouldBeNil)
So(b, ShouldResemble, []byte("abc2"))
err = r.Close()
So(err, ShouldBeNil)
}
{
w, err := s.server.NextWriter(message.MessageText, parser.MESSAGE)
So(err, ShouldBeNil)
_, err = w.Write([]byte("abc"))
So(err, ShouldBeNil)
err = w.Close()
So(err, ShouldBeNil)
}
{
r, err := client.NextReader()
So(err, ShouldBeNil)
b, err := ioutil.ReadAll(r)
So(err, ShouldBeNil)
So(b, ShouldResemble, []byte("abc"))
err = r.Close()
So(err, ShouldBeNil)
}
client.Close()
})
}
type server struct {
server transport.Server
callback *fakeCallback
}
func newServer() *server {
return &server{
callback: newFakeCallback(),
}
}
func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if s.server == nil {
var err error
s.server, err = NewServer(w, r, s.callback)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
w.Header().Set("Custom", "value")
s.server.ServeHTTP(w, r)
}