|
|
@@ -6,6 +6,8 @@ package websocket
|
|
|
|
|
|
import (
|
|
|
"bytes"
|
|
|
+ "encoding/json"
|
|
|
+ "io"
|
|
|
"reflect"
|
|
|
"testing"
|
|
|
)
|
|
|
@@ -36,6 +38,60 @@ func TestJSON(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func TestPartialJsonRead(t *testing.T) {
|
|
|
+ var buf bytes.Buffer
|
|
|
+ c := fakeNetConn{&buf, &buf}
|
|
|
+ wc := newConn(c, true, 1024, 1024)
|
|
|
+ rc := newConn(c, false, 1024, 1024)
|
|
|
+
|
|
|
+ var v struct {
|
|
|
+ A int
|
|
|
+ B string
|
|
|
+ }
|
|
|
+ v.A = 1
|
|
|
+ v.B = "hello"
|
|
|
+
|
|
|
+ messageCount := 0
|
|
|
+
|
|
|
+ // Partial JSON values.
|
|
|
+
|
|
|
+ data, err := json.Marshal(v)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ for i := len(data) - 1; i >= 0; i-- {
|
|
|
+ if err := wc.WriteMessage(TextMessage, data[:i]); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ messageCount++
|
|
|
+ }
|
|
|
+
|
|
|
+ // Whitespace.
|
|
|
+
|
|
|
+ if err := wc.WriteMessage(TextMessage, []byte(" ")); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ messageCount++
|
|
|
+
|
|
|
+ // Close.
|
|
|
+
|
|
|
+ if err := wc.WriteMessage(CloseMessage, FormatCloseMessage(CloseNormalClosure, "")); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ for i := 0; i < messageCount; i++ {
|
|
|
+ err := rc.ReadJSON(&v)
|
|
|
+ if err != io.ErrUnexpectedEOF {
|
|
|
+ t.Error("read", i, err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ err = rc.ReadJSON(&v)
|
|
|
+ if err != io.EOF {
|
|
|
+ t.Error("final", err)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func TestDeprecatedJSON(t *testing.T) {
|
|
|
var buf bytes.Buffer
|
|
|
c := fakeNetConn{&buf, &buf}
|