GoPLS Viewer

Home|gopls/internal/jsonrpc2_v2/wire_test.go
1// Copyright 2020 The Go 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 jsonrpc2_test
6
7import (
8    "bytes"
9    "encoding/json"
10    "reflect"
11    "testing"
12
13    jsonrpc2 "golang.org/x/tools/internal/jsonrpc2_v2"
14)
15
16func TestWireMessage(t *testing.T) {
17    for _test := range []struct {
18        name    string
19        msg     jsonrpc2.Message
20        encoded []byte
21    }{{
22        name:    "notification",
23        msg:     newNotification("alive"nil),
24        encoded: []byte(`{"jsonrpc":"2.0","method":"alive"}`),
25    }, {
26        name:    "call",
27        msg:     newCall("msg1""ping"nil),
28        encoded: []byte(`{"jsonrpc":"2.0","id":"msg1","method":"ping"}`),
29    }, {
30        name:    "response",
31        msg:     newResponse("msg2""pong"nil),
32        encoded: []byte(`{"jsonrpc":"2.0","id":"msg2","result":"pong"}`),
33    }, {
34        name:    "numerical id",
35        msg:     newCall(1"poke"nil),
36        encoded: []byte(`{"jsonrpc":"2.0","id":1,"method":"poke"}`),
37    }, {
38        // originally reported in #39719, this checks that result is not present if
39        // it is an error response
40        name"computing fix edits",
41        msg:  newResponse(3niljsonrpc2.NewError(0"computing fix edits")),
42        encoded: []byte(`{
43        "jsonrpc":"2.0",
44        "id":3,
45        "error":{
46            "code":0,
47            "message":"computing fix edits"
48        }
49    }`),
50    }} {
51        berr := jsonrpc2.EncodeMessage(test.msg)
52        if err != nil {
53            t.Fatal(err)
54        }
55        checkJSON(tbtest.encoded)
56        msgerr := jsonrpc2.DecodeMessage(test.encoded)
57        if err != nil {
58            t.Fatal(err)
59        }
60        if !reflect.DeepEqual(msgtest.msg) {
61            t.Errorf("decoded message does not match\nGot:\n%+#v\nWant:\n%+#v"msgtest.msg)
62        }
63    }
64}
65
66func newNotification(method stringparams interface{}) jsonrpc2.Message {
67    msgerr := jsonrpc2.NewNotification(methodparams)
68    if err != nil {
69        panic(err)
70    }
71    return msg
72}
73
74func newID(id interface{}) jsonrpc2.ID {
75    switch v := id.(type) {
76    case nil:
77        return jsonrpc2.ID{}
78    case string:
79        return jsonrpc2.StringID(v)
80    case int:
81        return jsonrpc2.Int64ID(int64(v))
82    case int64:
83        return jsonrpc2.Int64ID(v)
84    default:
85        panic("invalid ID type")
86    }
87}
88
89func newCall(id interface{}, method stringparams interface{}) jsonrpc2.Message {
90    msgerr := jsonrpc2.NewCall(newID(id), methodparams)
91    if err != nil {
92        panic(err)
93    }
94    return msg
95}
96
97func newResponse(id interface{}, result interface{}, rerr errorjsonrpc2.Message {
98    msgerr := jsonrpc2.NewResponse(newID(id), resultrerr)
99    if err != nil {
100        panic(err)
101    }
102    return msg
103}
104
105func checkJSON(t *testing.Tgotwant []byte) {
106    // compare the compact form, to allow for formatting differences
107    g := &bytes.Buffer{}
108    if err := json.Compact(g, []byte(got)); err != nil {
109        t.Fatal(err)
110    }
111    w := &bytes.Buffer{}
112    if err := json.Compact(w, []byte(want)); err != nil {
113        t.Fatal(err)
114    }
115    if g.String() != w.String() {
116        t.Errorf("encoded message does not match\nGot:\n%s\nWant:\n%s"gw)
117    }
118}
119
MembersX
TestWireMessage.t
newID
newResponse.result
TestWireMessage
TestWireMessage.RangeStmt_335.BlockStmt.err
TestWireMessage.RangeStmt_335.BlockStmt.msg
newNotification.params
newNotification.msg
newNotification.err
TestWireMessage.RangeStmt_335.BlockStmt.b
newCall.id
newCall.params
newCall.msg
checkJSON.t
checkJSON.got
TestWireMessage.RangeStmt_335.test
newID.id
newCall
newResponse.msg
newCall.method
newResponse
checkJSON.want
newNotification
newCall.err
newResponse.rerr
bytes
newResponse.err
checkJSON.w
newNotification.method
newResponse.id
checkJSON
checkJSON.g
checkJSON.err
Members
X