v2 / vlib / net / jsonrpc / server_test.v
102 lines · 81 sloc · 2.03 KB · 2b4831c8d65f1d8699c55733f231465bff846aa3
Raw
1module jsonrpc
2
3import strings
4
5struct StringRW {
6mut:
7 buf strings.Builder = strings.new_builder(4096)
8}
9
10fn (mut s StringRW) read(mut buf []u8) !int {
11 data := s.buf.str().bytes()
12 len := copy(mut buf, data)
13 s.buf = strings.new_builder(4096)
14 return len
15}
16
17fn (mut s StringRW) write(buf []u8) !int {
18 return s.buf.write(buf)
19}
20
21struct KVItem {
22 key string
23 value string
24}
25
26fn handle_test(req &Request, mut wr ResponseWriter) {
27 p := req.decode_params[KVItem]() or {
28 wr.write_error(invalid_params)
29 return
30 }
31
32 wr.write(p)
33}
34
35fn test_server_request_response() {
36 mut stream := StringRW{}
37 mut srv := new_server(ServerConfig{
38 stream: stream
39 handler: handle_test
40 })
41
42 id := 'req'
43 method := 'kv.item'
44 params := KVItem{
45 key: 'foo'
46 value: 'bar'
47 }
48 srv.stream.write(new_request(method, params, id).encode().bytes())!
49
50 srv.respond()!
51
52 mut enc_resp := []u8{len: 4096}
53 srv.stream.read(mut enc_resp)!
54 resp := decode_response(enc_resp.bytestr())!
55
56 assert resp.jsonrpc == version
57 assert resp.decode_result[KVItem]()! == params
58 assert resp.error == ResponseError{}
59 assert resp.id == id
60}
61
62fn test_server_router_request_response() {
63 mut r := Router{}
64 method := 'kv.item'
65 r.register(method, handle_test)
66 mut stream := StringRW{}
67 mut srv := new_server(ServerConfig{
68 stream: stream
69 handler: r.handle_jsonrpc
70 })
71
72 id := 'req'
73 params := KVItem{
74 key: 'foo'
75 value: 'bar'
76 }
77 srv.stream.write(new_request(method, params, id).encode().bytes())!
78
79 srv.respond()!
80
81 mut enc_resp := []u8{len: 4096}
82 srv.stream.read(mut enc_resp)!
83 mut resp := decode_response(enc_resp.bytestr())!
84
85 assert resp.jsonrpc == version
86 assert resp.decode_result[KVItem]()! == params
87 assert resp.error == ResponseError{}
88 assert resp.id == id
89
90 srv.stream.write(new_request('unknown', params, id).encode().bytes())!
91
92 srv.respond()!
93
94 enc_resp = []u8{len: 4096}
95 srv.stream.read(mut enc_resp)!
96 resp = decode_response(enc_resp.bytestr())!
97
98 assert resp.jsonrpc == version
99 assert resp.decode_result[Empty]()! == empty
100 assert resp.error == method_not_found
101 assert resp.id == id
102}
103