jsonrpc - client_test.go
1 package jsonrpc
2
3 import (
4 "bytes"
5 "encoding/json"
6 "errors"
7 "io"
8 "reflect"
9 "testing"
10 "time"
11 )
12
13 type rw struct {
14 io.ReadCloser
15 io.WriteCloser
16 }
17
18 func (r *rw) Close() error {
19 r.ReadCloser.Close()
20 r.WriteCloser.Close()
21
22 return nil
23 }
24
25 func makeServerClientConn() (ReadWriteCloser, ReadWriteCloser) {
26 ar, bw := io.Pipe()
27 br, aw := io.Pipe()
28
29 return &rw{
30 ReadCloser: ar,
31 WriteCloser: aw,
32 }, &rw{
33 ReadCloser: br,
34 WriteCloser: bw,
35 }
36 }
37
38 type simpleHandler struct{}
39
40 var ErrUnknownEndpoint = &Error{
41 Message: "unknown endpoint",
42 }
43
44 func (simpleHandler) HandleRPC(method string, data json.RawMessage) (any, error) {
45 switch method {
46 case "add":
47 var toAdd [2]int
48 if err := json.Unmarshal(data, &toAdd); err != nil {
49 return nil, err
50 }
51
52 return toAdd[0] + toAdd[1], nil
53 }
54 return nil, ErrUnknownEndpoint
55 }
56
57 func TestRequest(t *testing.T) {
58 serverConn, clientConn := makeServerClientConn()
59
60 s := New(serverConn, new(simpleHandler))
61 go s.Handle()
62 defer serverConn.Close()
63
64 c := NewClient(clientConn)
65 defer c.Close()
66
67 for n, test := range [...]struct {
68 Method string
69 Params any
70 Response json.RawMessage
71 Error error
72 }{
73 {
74 Method: "unknown",
75 Error: ErrUnknownEndpoint,
76 },
77 {
78 Method: "add",
79 Params: [2]int{5, 6},
80 Response: json.RawMessage{'1', '1'},
81 },
82 } {
83 resp, err := c.Request(test.Method, test.Params)
84 if !errors.Is(test.Error, err) {
85 t.Errorf("test %d: expecting error %s, got %s", n+1, test.Error, err)
86 } else if !bytes.Equal(test.Response, resp) {
87 t.Errorf("test %d: expecting response %s, got %s", n+1, test.Response, resp)
88 }
89 }
90 }
91
92 func TestAwait(t *testing.T) {
93 t.Parallel()
94 serverConn, clientConn := makeServerClientConn()
95
96 s := New(serverConn, new(simpleHandler))
97 go s.Handle()
98 defer serverConn.Close()
99
100 c := NewClient(clientConn)
101 defer c.Close()
102
103 resp := make(chan int, 2)
104
105 c.Await(-1, func(data json.RawMessage) {
106 var num int
107 json.Unmarshal(data, &num)
108
109 resp <- num
110 })
111
112 total := receiveData(s, resp)
113 if total != 5 {
114 t.Errorf("expecting result 5, got %d", total)
115 }
116 }
117
118 func receiveData(s *Server, ch chan int) int {
119 s.Send(Response{
120 ID: -1,
121 Result: 5,
122 })
123 s.Send(Response{
124 ID: -1,
125 Result: 6,
126 })
127
128 var total int
129 timeout := time.After(time.Second)
130
131 Loop:
132 for {
133 select {
134 case num := <-ch:
135 total += num
136 case <-timeout:
137 break Loop
138 }
139 }
140
141 return total
142 }
143
144 func TestSubscribe(t *testing.T) {
145 t.Parallel()
146 serverConn, clientConn := makeServerClientConn()
147
148 s := New(serverConn, new(simpleHandler))
149 go s.Handle()
150 defer serverConn.Close()
151
152 c := NewClient(clientConn)
153 defer c.Close()
154
155 resp := make(chan int, 2)
156
157 c.Subscribe(-1, func(data json.RawMessage) {
158 var num int
159 json.Unmarshal(data, &num)
160
161 resp <- num
162 })
163
164 total := receiveData(s, resp)
165
166 if total != 11 {
167 t.Errorf("expecting result 11, got %d", total)
168 }
169 }
170
171 func TestRequestValue(t *testing.T) {
172 serverConn, clientConn := makeServerClientConn()
173
174 s := New(serverConn, new(simpleHandler))
175 go s.Handle()
176 defer serverConn.Close()
177
178 c := NewClient(clientConn)
179 defer c.Close()
180
181 for n, test := range [...]struct {
182 Method string
183 Params any
184 Response any
185 Error error
186 }{
187 {
188 Method: "add",
189 Params: [2]int{5, 6},
190 Response: int(11),
191 },
192 } {
193 v := reflect.New(reflect.TypeOf(test.Response))
194 err := c.RequestValue(test.Method, test.Params, v.Interface())
195 if !errors.Is(test.Error, err) {
196 t.Errorf("test %d: expecting error %s, got %s", n+1, test.Error, err)
197 } else if resp := v.Elem().Interface(); !reflect.DeepEqual(test.Response, resp) {
198 t.Errorf("test %d: expecting response %s, got %s", n+1, test.Response, resp)
199 }
200 }
201 }
202