transport_test.go

  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}