Skip to content

Commit a425169

Browse files
committed
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
1 parent f54ebfd commit a425169

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

handler.go

+1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ func (h *socketHandler) onPacket(decoder *decoder, packet *packet) ([]interface{
134134
case _ERROR:
135135
message = "error"
136136
case _ACK:
137+
fallthrough
137138
case _BINARY_ACK:
138139
return nil, h.onAck(packet.Id, decoder, packet)
139140
default:

handler_test.go

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package socketio
2+
3+
import (
4+
"testing"
5+
6+
. "github.com/smartystreets/goconvey/convey"
7+
"net/http"
8+
"io"
9+
"github.com/googollee/go-engine.io"
10+
)
11+
12+
type FakeBroadcastAdaptor struct {}
13+
14+
func (f *FakeBroadcastAdaptor) Join(room string, socket Socket) error {
15+
return nil
16+
}
17+
18+
func (f *FakeBroadcastAdaptor) Leave(room string, socket Socket) error {
19+
return nil
20+
}
21+
22+
func (f *FakeBroadcastAdaptor) Send(ignore Socket, room, event string, args ...interface{}) error {
23+
return nil
24+
}
25+
26+
type FakeReadCloser struct {}
27+
28+
func (fr *FakeReadCloser) Read(p []byte) (n int, err error) {
29+
p = append(p, byte(128))
30+
return 1, nil
31+
}
32+
33+
func (fr *FakeReadCloser) Close() error {
34+
return nil
35+
}
36+
37+
type FakeWriteCloser struct {}
38+
39+
func (fr *FakeWriteCloser) Write(p []byte) (n int, err error) {
40+
return len(p), nil
41+
}
42+
43+
func (fr *FakeWriteCloser) Close() error {
44+
return nil
45+
}
46+
47+
type FakeSockConnection struct {}
48+
49+
func (f *FakeSockConnection) Id() string {
50+
return "test1"
51+
}
52+
53+
func (f *FakeSockConnection) Request() *http.Request {
54+
return &http.Request{}
55+
}
56+
57+
func (f *FakeSockConnection) Close() error {
58+
return nil
59+
}
60+
61+
func (f *FakeSockConnection) NextReader() (engineio.MessageType, io.ReadCloser, error) {
62+
return engineio.MessageText, &FakeReadCloser{}, nil
63+
}
64+
65+
func (f *FakeSockConnection) NextWriter(messageType engineio.MessageType) (io.WriteCloser, error) {
66+
return &FakeWriteCloser{}, nil
67+
}
68+
69+
70+
func TestHandler(t *testing.T) {
71+
//BugFix missed
72+
//Method: handler.onPacket
73+
//Reason: missed fallthrough after case _ACK:
74+
//
75+
// case _ACK:
76+
// fallthrough <---- fixed problem
77+
//
78+
Convey("Call ACK handler by ACK id received from client", t, func() {
79+
saver := &FrameSaver{}
80+
var handlerCalled bool
81+
baseHandlerInstance := newBaseHandler("some:event", &FakeBroadcastAdaptor{})
82+
socketInstance := newSocket(&FakeSockConnection{}, baseHandlerInstance)
83+
c, _ := newCaller(func () {handlerCalled = true})
84+
85+
socketInstance.acks[0] = c
86+
socketInstance.onPacket(newDecoder(saver), &packet{Type:_ACK, Id:0, Data:"[]", NSP:"/"})
87+
88+
So(len(socketInstance.acks), ShouldEqual, 0)
89+
So(handlerCalled, ShouldBeTrue)
90+
})
91+
92+
Convey("Call BINARY ACK handler by BINARY ACK id received from client", t, func() {
93+
saver := &FrameSaver{}
94+
var handlerCalled bool
95+
baseHandlerInstance := newBaseHandler("some:event", &FakeBroadcastAdaptor{})
96+
socketInstance := newSocket(&FakeSockConnection{}, baseHandlerInstance)
97+
c, _ := newCaller(func () {handlerCalled = true})
98+
99+
socketInstance.acks[0] = c
100+
socketInstance.onPacket(newDecoder(saver), &packet{Type:_BINARY_ACK, Id:0, Data:"[]", NSP:"/"})
101+
102+
So(len(socketInstance.acks), ShouldEqual, 0)
103+
So(handlerCalled, ShouldBeTrue)
104+
})
105+
}

0 commit comments

Comments
 (0)