1package daemonrpc
2
3import (
4 "encoding/json"
5 "net"
6 "testing"
7)
8
9func testPipe() (*Conn, *Conn) {
10 a, b := net.Pipe()
11 return NewConn(a), NewConn(b)
12}
13
14func TestConn_SendReceiveRequest(t *testing.T) {
15 client, server := testPipe()
16 defer client.Close()
17 defer server.Close()
18
19 done := make(chan error, 1)
20 go func() {
21 params, _ := json.Marshal(PingResult{Pong: true})
22 err := client.Send(&Request{ID: 1, Method: MethodPing, Params: params})
23 done <- err
24 }()
25
26 msg, err := server.ReceiveMessage()
27 if err != nil {
28 t.Fatal(err)
29 }
30 if msg.Request == nil {
31 t.Fatal("expected Request")
32 }
33 if msg.Request.Method != MethodPing {
34 t.Errorf("method = %q, want Ping", msg.Request.Method)
35 }
36
37 if err := <-done; err != nil {
38 t.Fatal(err)
39 }
40}
41
42func TestConn_SendResponse(t *testing.T) {
43 client, server := testPipe()
44 defer client.Close()
45 defer server.Close()
46
47 done := make(chan error, 1)
48 go func() {
49 err := server.SendResponse(1, PingResult{Pong: true})
50 done <- err
51 }()
52
53 msg, err := client.ReceiveMessage()
54 if err != nil {
55 t.Fatal(err)
56 }
57 if msg.Response == nil {
58 t.Fatal("expected Response")
59 }
60 if msg.Response.ID != 1 {
61 t.Errorf("id = %d, want 1", msg.Response.ID)
62 }
63
64 var result PingResult
65 if err := json.Unmarshal(msg.Response.Result, &result); err != nil {
66 t.Fatal(err)
67 }
68 if !result.Pong {
69 t.Error("expected pong=true")
70 }
71
72 if err := <-done; err != nil {
73 t.Fatal(err)
74 }
75}
76
77func TestConn_SendError(t *testing.T) {
78 client, server := testPipe()
79 defer client.Close()
80 defer server.Close()
81
82 done := make(chan error, 1)
83 go func() {
84 err := server.SendError(5, ErrCodeNotFound, "method not found")
85 done <- err
86 }()
87
88 msg, err := client.ReceiveMessage()
89 if err != nil {
90 t.Fatal(err)
91 }
92 if msg.Response == nil {
93 t.Fatal("expected Response")
94 }
95 if msg.Response.Error == nil {
96 t.Fatal("expected error")
97 }
98 if msg.Response.Error.Code != ErrCodeNotFound {
99 t.Errorf("code = %d, want %d", msg.Response.Error.Code, ErrCodeNotFound)
100 }
101
102 if err := <-done; err != nil {
103 t.Fatal(err)
104 }
105}
106
107func TestConn_SendEvent(t *testing.T) {
108 client, server := testPipe()
109 defer client.Close()
110 defer server.Close()
111
112 done := make(chan error, 1)
113 go func() {
114 err := server.SendEvent(EventNewMail, NewMailEvent{
115 AccountID: "acc1",
116 Folder: "INBOX",
117 })
118 done <- err
119 }()
120
121 msg, err := client.ReceiveMessage()
122 if err != nil {
123 t.Fatal(err)
124 }
125 if msg.Event == nil {
126 t.Fatal("expected Event")
127 }
128 if msg.Event.Type != EventNewMail {
129 t.Errorf("type = %q, want NewMail", msg.Event.Type)
130 }
131
132 var ev NewMailEvent
133 if err := json.Unmarshal(msg.Event.Data, &ev); err != nil {
134 t.Fatal(err)
135 }
136 if ev.AccountID != "acc1" {
137 t.Errorf("account_id = %q, want acc1", ev.AccountID)
138 }
139
140 if err := <-done; err != nil {
141 t.Fatal(err)
142 }
143}
144
145func TestConn_MultipleMessages(t *testing.T) {
146 client, server := testPipe()
147 defer client.Close()
148 defer server.Close()
149
150 go func() {
151 client.Send(&Request{ID: 1, Method: MethodPing})
152 client.Send(&Request{ID: 2, Method: MethodGetStatus})
153 }()
154
155 msg1, err := server.ReceiveMessage()
156 if err != nil {
157 t.Fatal(err)
158 }
159 if msg1.Request.ID != 1 {
160 t.Errorf("first id = %d, want 1", msg1.Request.ID)
161 }
162
163 msg2, err := server.ReceiveMessage()
164 if err != nil {
165 t.Fatal(err)
166 }
167 if msg2.Request.ID != 2 {
168 t.Errorf("second id = %d, want 2", msg2.Request.ID)
169 }
170}