1// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package websocket
6
7import (
8	"bytes"
9	"encoding/json"
10	"io"
11	"reflect"
12	"testing"
13)
14
15func TestJSON(t *testing.T) {
16	var buf bytes.Buffer
17	wc := newTestConn(nil, &buf, true)
18	rc := newTestConn(&buf, nil, false)
19
20	var actual, expect struct {
21		A int
22		B string
23	}
24	expect.A = 1
25	expect.B = "hello"
26
27	if err := wc.WriteJSON(&expect); err != nil {
28		t.Fatal("write", err)
29	}
30
31	if err := rc.ReadJSON(&actual); err != nil {
32		t.Fatal("read", err)
33	}
34
35	if !reflect.DeepEqual(&actual, &expect) {
36		t.Fatal("equal", actual, expect)
37	}
38}
39
40func TestPartialJSONRead(t *testing.T) {
41	var buf0, buf1 bytes.Buffer
42	wc := newTestConn(nil, &buf0, true)
43	rc := newTestConn(&buf0, &buf1, false)
44
45	var v struct {
46		A int
47		B string
48	}
49	v.A = 1
50	v.B = "hello"
51
52	messageCount := 0
53
54	// Partial JSON values.
55
56	data, err := json.Marshal(v)
57	if err != nil {
58		t.Fatal(err)
59	}
60	for i := len(data) - 1; i >= 0; i-- {
61		if err := wc.WriteMessage(TextMessage, data[:i]); err != nil {
62			t.Fatal(err)
63		}
64		messageCount++
65	}
66
67	// Whitespace.
68
69	if err := wc.WriteMessage(TextMessage, []byte(" ")); err != nil {
70		t.Fatal(err)
71	}
72	messageCount++
73
74	// Close.
75
76	if err := wc.WriteMessage(CloseMessage, FormatCloseMessage(CloseNormalClosure, "")); err != nil {
77		t.Fatal(err)
78	}
79
80	for i := 0; i < messageCount; i++ {
81		err := rc.ReadJSON(&v)
82		if err != io.ErrUnexpectedEOF {
83			t.Error("read", i, err)
84		}
85	}
86
87	err = rc.ReadJSON(&v)
88	if _, ok := err.(*CloseError); !ok {
89		t.Error("final", err)
90	}
91}
92
93func TestDeprecatedJSON(t *testing.T) {
94	var buf bytes.Buffer
95	wc := newTestConn(nil, &buf, true)
96	rc := newTestConn(&buf, nil, false)
97
98	var actual, expect struct {
99		A int
100		B string
101	}
102	expect.A = 1
103	expect.B = "hello"
104
105	if err := WriteJSON(wc, &expect); err != nil {
106		t.Fatal("write", err)
107	}
108
109	if err := ReadJSON(rc, &actual); err != nil {
110		t.Fatal("read", err)
111	}
112
113	if !reflect.DeepEqual(&actual, &expect) {
114		t.Fatal("equal", actual, expect)
115	}
116}
117