@@ -12,16 +12,21 @@ import (
1212 "net/url"
1313 "os"
1414 "os/exec"
15+ "reflect"
1516 "strconv"
1617 "strings"
1718 "sync/atomic"
1819 "testing"
1920 "time"
2021
22+ "github.com/golang/protobuf/ptypes"
23+ "github.com/golang/protobuf/ptypes/duration"
2124 "github.com/google/go-cmp/cmp"
2225 "golang.org/x/xerrors"
2326
2427 "nhooyr.io/websocket"
28+ "nhooyr.io/websocket/wsjson"
29+ "nhooyr.io/websocket/wspb"
2530)
2631
2732func TestHandshake (t * testing.T ) {
@@ -201,84 +206,139 @@ func TestHandshake(t *testing.T) {
201206 return nil
202207 },
203208 },
204- // {
205- // name: "echo",
206- // server: func(w http.ResponseWriter, r *http.Request) error {
207- // c, err := websocket.Accept(w, r, websocket.AcceptOptions{})
208- // if err != nil {
209- // return err
210- // }
211- // defer c.Close(websocket.StatusInternalError, "")
212- //
213- // ctx, cancel := context.WithTimeout(r.Context(), time.Second*5)
214- // defer cancel()
215- //
216- // write := func() error {
217- // jc := websocket.JSONConn{
218- // C: c,
219- // }
220- //
221- // v := map[string]interface{}{
222- // "anmol": "wowow",
223- // }
224- // err = jc.Write(ctx, v)
225- // if err != nil {
226- // return err
227- // }
228- // return nil
229- // }
230- // err = write()
231- // if err != nil {
232- // return err
233- // }
234- // err = write()
235- // if err != nil {
236- // return err
237- // }
238- //
239- // c.Close(websocket.StatusNormalClosure, "")
240- // return nil
241- // },
242- // client: func(ctx context.Context, u string) error {
243- // c, _, err := websocket.Dial(ctx, u, websocket.DialOptions{})
244- // if err != nil {
245- // return err
246- // }
247- // defer c.Close(websocket.StatusInternalError, "")
248- //
249- // jc := websocket.JSONConn{
250- // C: c,
251- // }
252- //
253- // read := func() error {
254- // var v interface{}
255- // err = jc.Read(ctx, &v)
256- // if err != nil {
257- // return err
258- // }
259- //
260- // exp := map[string]interface{}{
261- // "anmol": "wowow",
262- // }
263- // if !reflect.DeepEqual(exp, v) {
264- // return xerrors.Errorf("expected %v but got %v", exp, v)
265- // }
266- // return nil
267- // }
268- // err = read()
269- // if err != nil {
270- // return err
271- // }
272- // // Read twice to ensure the un EOFed previous reader works correctly.
273- // err = read()
274- // if err != nil {
275- // return err
276- // }
277- //
278- // c.Close(websocket.StatusNormalClosure, "")
279- // return nil
280- // },
281- // },
209+ {
210+ name : "jsonEcho" ,
211+ server : func (w http.ResponseWriter , r * http.Request ) error {
212+ c , err := websocket .Accept (w , r , websocket.AcceptOptions {})
213+ if err != nil {
214+ return err
215+ }
216+ defer c .Close (websocket .StatusInternalError , "" )
217+
218+ ctx , cancel := context .WithTimeout (r .Context (), time .Second * 5 )
219+ defer cancel ()
220+
221+ write := func () error {
222+ v := map [string ]interface {}{
223+ "anmol" : "wowow" ,
224+ }
225+ err := wsjson .Write (ctx , c , v )
226+ return err
227+ }
228+ err = write ()
229+ if err != nil {
230+ return err
231+ }
232+ err = write ()
233+ if err != nil {
234+ return err
235+ }
236+
237+ c .Close (websocket .StatusNormalClosure , "" )
238+ return nil
239+ },
240+ client : func (ctx context.Context , u string ) error {
241+ c , _ , err := websocket .Dial (ctx , u , websocket.DialOptions {})
242+ if err != nil {
243+ return err
244+ }
245+ defer c .Close (websocket .StatusInternalError , "" )
246+
247+ read := func () error {
248+ var v interface {}
249+ err := wsjson .Read (ctx , c , & v )
250+ if err != nil {
251+ return err
252+ }
253+
254+ exp := map [string ]interface {}{
255+ "anmol" : "wowow" ,
256+ }
257+ if ! reflect .DeepEqual (exp , v ) {
258+ return xerrors .Errorf ("expected %v but got %v" , exp , v )
259+ }
260+ return nil
261+ }
262+ err = read ()
263+ if err != nil {
264+ return err
265+ }
266+ // Read twice to ensure the un EOFed previous reader works correctly.
267+ err = read ()
268+ if err != nil {
269+ return err
270+ }
271+
272+ c .Close (websocket .StatusNormalClosure , "" )
273+ return nil
274+ },
275+ },
276+ {
277+ name : "protobufEcho" ,
278+ server : func (w http.ResponseWriter , r * http.Request ) error {
279+ c , err := websocket .Accept (w , r , websocket.AcceptOptions {})
280+ if err != nil {
281+ return err
282+ }
283+ defer c .Close (websocket .StatusInternalError , "" )
284+
285+ ctx , cancel := context .WithTimeout (r .Context (), time .Second * 5 )
286+ defer cancel ()
287+
288+ write := func () error {
289+ err := wspb .Write (ctx , c , ptypes .DurationProto (100 ))
290+ return err
291+ }
292+ err = write ()
293+ if err != nil {
294+ return err
295+ }
296+ err = write ()
297+ if err != nil {
298+ return err
299+ }
300+
301+ c .Close (websocket .StatusNormalClosure , "" )
302+ return nil
303+ },
304+ client : func (ctx context.Context , u string ) error {
305+ c , _ , err := websocket .Dial (ctx , u , websocket.DialOptions {})
306+ if err != nil {
307+ return err
308+ }
309+ defer c .Close (websocket .StatusInternalError , "" )
310+
311+ read := func () error {
312+ var v duration.Duration
313+ err := wspb .Read (ctx , c , & v )
314+ if err != nil {
315+ return err
316+ }
317+
318+ d , err := ptypes .Duration (& v )
319+ if err != nil {
320+ return xerrors .Errorf ("failed to convert duration.Duration to time.Duration: %w" , err )
321+ }
322+ const exp = time .Duration (100 )
323+ if ! reflect .DeepEqual (exp , d ) {
324+ return xerrors .Errorf ("expected %v but got %v" , exp , d )
325+ }
326+ return nil
327+ }
328+ err = read ()
329+ if err != nil {
330+ return err
331+ }
332+ // Read twice to ensure the un EOFed previous reader works correctly.
333+ err = read ()
334+ if err != nil {
335+ return err
336+ }
337+
338+ c .Close (websocket .StatusNormalClosure , "" )
339+ return nil
340+ },
341+ },
282342 {
283343 name : "cookies" ,
284344 server : func (w http.ResponseWriter , r * http.Request ) error {
0 commit comments