From a425169fce156c2dc74c3de2a2cea223bfb2aa57 Mon Sep 17 00:00:00 2001 From: CyberLight Date: Tue, 10 May 2016 15:44:22 +0600 Subject: [PATCH] Fixed problem with processing of client ACK packet * Problem in missed ```fallthrough``` in switch between _ACK and _BINARY_ACK * Added tests for checking _ACK and _BINARY_ACK client packet processing --- handler.go | 1 + handler_test.go | 105 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 handler_test.go diff --git a/handler.go b/handler.go index 04f50001..0bf2c4a4 100644 --- a/handler.go +++ b/handler.go @@ -134,6 +134,7 @@ func (h *socketHandler) onPacket(decoder *decoder, packet *packet) ([]interface{ case _ERROR: message = "error" case _ACK: + fallthrough case _BINARY_ACK: return nil, h.onAck(packet.Id, decoder, packet) default: diff --git a/handler_test.go b/handler_test.go new file mode 100644 index 00000000..9c5a1232 --- /dev/null +++ b/handler_test.go @@ -0,0 +1,105 @@ +package socketio + +import ( + "testing" + + . "github.com/smartystreets/goconvey/convey" + "net/http" + "io" + "github.com/googollee/go-engine.io" +) + +type FakeBroadcastAdaptor struct {} + +func (f *FakeBroadcastAdaptor) Join(room string, socket Socket) error { + return nil +} + +func (f *FakeBroadcastAdaptor) Leave(room string, socket Socket) error { + return nil +} + +func (f *FakeBroadcastAdaptor) Send(ignore Socket, room, event string, args ...interface{}) error { + return nil +} + +type FakeReadCloser struct {} + +func (fr *FakeReadCloser) Read(p []byte) (n int, err error) { + p = append(p, byte(128)) + return 1, nil +} + +func (fr *FakeReadCloser) Close() error { + return nil +} + +type FakeWriteCloser struct {} + +func (fr *FakeWriteCloser) Write(p []byte) (n int, err error) { + return len(p), nil +} + +func (fr *FakeWriteCloser) Close() error { + return nil +} + +type FakeSockConnection struct {} + +func (f *FakeSockConnection) Id() string { + return "test1" +} + +func (f *FakeSockConnection) Request() *http.Request { + return &http.Request{} +} + +func (f *FakeSockConnection) Close() error { + return nil +} + +func (f *FakeSockConnection) NextReader() (engineio.MessageType, io.ReadCloser, error) { + return engineio.MessageText, &FakeReadCloser{}, nil +} + +func (f *FakeSockConnection) NextWriter(messageType engineio.MessageType) (io.WriteCloser, error) { + return &FakeWriteCloser{}, nil +} + + +func TestHandler(t *testing.T) { + //BugFix missed + //Method: handler.onPacket + //Reason: missed fallthrough after case _ACK: + // + // case _ACK: + // fallthrough <---- fixed problem + // + Convey("Call ACK handler by ACK id received from client", t, func() { + saver := &FrameSaver{} + var handlerCalled bool + baseHandlerInstance := newBaseHandler("some:event", &FakeBroadcastAdaptor{}) + socketInstance := newSocket(&FakeSockConnection{}, baseHandlerInstance) + c, _ := newCaller(func () {handlerCalled = true}) + + socketInstance.acks[0] = c + socketInstance.onPacket(newDecoder(saver), &packet{Type:_ACK, Id:0, Data:"[]", NSP:"/"}) + + So(len(socketInstance.acks), ShouldEqual, 0) + So(handlerCalled, ShouldBeTrue) + }) + + Convey("Call BINARY ACK handler by BINARY ACK id received from client", t, func() { + saver := &FrameSaver{} + var handlerCalled bool + baseHandlerInstance := newBaseHandler("some:event", &FakeBroadcastAdaptor{}) + socketInstance := newSocket(&FakeSockConnection{}, baseHandlerInstance) + c, _ := newCaller(func () {handlerCalled = true}) + + socketInstance.acks[0] = c + socketInstance.onPacket(newDecoder(saver), &packet{Type:_BINARY_ACK, Id:0, Data:"[]", NSP:"/"}) + + So(len(socketInstance.acks), ShouldEqual, 0) + So(handlerCalled, ShouldBeTrue) + }) +} \ No newline at end of file