mirror of
https://github.com/sourcegraph/jsonrpc2.git
synced 2026-08-16 18:18:12 +02:00
128 lines
2.6 KiB
Go
128 lines
2.6 KiB
Go
package jsonrpc2_test
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"io"
|
|
"log"
|
|
"net"
|
|
"testing"
|
|
|
|
"github.com/sourcegraph/jsonrpc2"
|
|
)
|
|
|
|
func TestSetLogger(t *testing.T) {
|
|
ctx := t.Context()
|
|
|
|
rd, wr := io.Pipe()
|
|
defer rd.Close()
|
|
defer wr.Close()
|
|
|
|
buf := bufio.NewReader(rd)
|
|
logger := log.New(wr, "", log.Lmsgprefix)
|
|
|
|
a, b := net.Pipe()
|
|
connA := jsonrpc2.NewConn(
|
|
ctx,
|
|
jsonrpc2.NewBufferedStream(a, jsonrpc2.VSCodeObjectCodec{}),
|
|
noopHandler{},
|
|
jsonrpc2.SetLogger(logger),
|
|
)
|
|
connB := jsonrpc2.NewConn(
|
|
ctx,
|
|
jsonrpc2.NewBufferedStream(b, jsonrpc2.VSCodeObjectCodec{}),
|
|
noopHandler{},
|
|
)
|
|
defer connA.Close()
|
|
defer connB.Close()
|
|
|
|
// Write a response with no corresponding request.
|
|
if err := connB.Reply(ctx, jsonrpc2.ID{Num: 0}, nil); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
want := "jsonrpc2: ignoring response #0 with no corresponding request\n"
|
|
got, err := buf.ReadString('\n')
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got != want {
|
|
t.Fatalf("got %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
type dummyHandler struct {
|
|
t *testing.T
|
|
}
|
|
|
|
func (h *dummyHandler) Handle(ctx context.Context, conn *jsonrpc2.Conn, req *jsonrpc2.Request) {
|
|
if !req.Notif {
|
|
err := conn.Reply(ctx, req.ID, nil)
|
|
if err != nil {
|
|
h.t.Error(err)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestLogMessages(t *testing.T) {
|
|
ctx := t.Context()
|
|
|
|
rd, wr := io.Pipe()
|
|
defer rd.Close()
|
|
defer wr.Close()
|
|
|
|
buf := bufio.NewReader(rd)
|
|
logger := log.New(wr, "", log.Lmsgprefix)
|
|
|
|
a, b := net.Pipe()
|
|
connA := jsonrpc2.NewConn(
|
|
ctx,
|
|
jsonrpc2.NewBufferedStream(a, jsonrpc2.VSCodeObjectCodec{}),
|
|
&dummyHandler{t},
|
|
jsonrpc2.LogMessages(logger),
|
|
)
|
|
connB := jsonrpc2.NewConn(
|
|
ctx,
|
|
jsonrpc2.NewBufferedStream(b, jsonrpc2.VSCodeObjectCodec{}),
|
|
&dummyHandler{t},
|
|
)
|
|
defer connA.Close()
|
|
defer connB.Close()
|
|
|
|
go func() {
|
|
if err := connA.Call(ctx, "method1", nil, nil); err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
if err := connB.Call(ctx, "method2", nil, nil); err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
if err := connA.Notify(ctx, "notification1", nil); err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
if err := connB.Notify(ctx, "notification2", nil); err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
}()
|
|
|
|
for i, want := range []string{
|
|
"jsonrpc2: <-- request #0: method1: null\n",
|
|
"jsonrpc2: --> result #0: method1: null\n",
|
|
"jsonrpc2: --> request #0: method2: null\n",
|
|
"jsonrpc2: <-- result #0: method2: null\n",
|
|
"jsonrpc2: <-- notif: notification1: null\n",
|
|
"jsonrpc2: --> notif: notification2: null\n",
|
|
} {
|
|
got, err := buf.ReadString('\n')
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got != want {
|
|
t.Errorf("message %v: got %q, want %q", i, got, want)
|
|
}
|
|
}
|
|
}
|