mirror of
https://github.com/sourcegraph/jsonrpc2.git
synced 2026-06-18 21:20:02 +02:00
Cancel Handler context when connection closes
This commit is contained in:
parent
2cc94179e1
commit
9ca8fdc650
3 changed files with 55 additions and 21 deletions
62
conn_test.go
62
conn_test.go
|
|
@ -14,6 +14,40 @@ import (
|
|||
"github.com/sourcegraph/jsonrpc2"
|
||||
)
|
||||
|
||||
func TestConn(t *testing.T) {
|
||||
t.Run("cancels context when closed", func(t *testing.T) {
|
||||
ctxCanceled := make(chan struct{})
|
||||
|
||||
handler := handlerFunc(func(ctx context.Context, c *jsonrpc2.Conn, r *jsonrpc2.Request) {
|
||||
// Block until the context is canceled.
|
||||
<-ctx.Done()
|
||||
close(ctxCanceled)
|
||||
})
|
||||
|
||||
connA, connB := Pipe(noopHandler{}, jsonrpc2.AsyncHandler(handler))
|
||||
defer connA.Close()
|
||||
defer connB.Close()
|
||||
|
||||
// Send a notification from connA to connB to trigger connB's handler
|
||||
// function.
|
||||
if err := connA.Notify(context.Background(), "foo", nil, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Disconnect connA from connB.
|
||||
if err := connA.Close(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
select {
|
||||
case <-ctxCanceled:
|
||||
// Test passed, the handler's context was canceled.
|
||||
case <-time.After(time.Second):
|
||||
t.Fatal("context not canceled")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
var paramsTests = []struct {
|
||||
sendParams interface{}
|
||||
wantParams *json.RawMessage
|
||||
|
|
@ -198,12 +232,12 @@ func testParams(t *testing.T, want *json.RawMessage, fn func(c *jsonrpc2.Conn) e
|
|||
wg.Done()
|
||||
})
|
||||
|
||||
client, server := newClientServer(handler)
|
||||
defer client.Close()
|
||||
defer server.Close()
|
||||
connA, connB := Pipe(noopHandler{}, handler)
|
||||
defer connA.Close()
|
||||
defer connB.Close()
|
||||
|
||||
wg.Add(1)
|
||||
if err := fn(client); err != nil {
|
||||
if err := fn(connA); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
wg.Wait()
|
||||
|
|
@ -242,18 +276,12 @@ func assertRawJSONMessage(t *testing.T, got *json.RawMessage, want *json.RawMess
|
|||
}
|
||||
}
|
||||
|
||||
func newClientServer(handler jsonrpc2.Handler) (client *jsonrpc2.Conn, server *jsonrpc2.Conn) {
|
||||
// Pipe returns two jsonrpc2.Conn, connected via a synchronous, in-memory, full
|
||||
// duplex network connection.
|
||||
func Pipe(handlerA, handlerB jsonrpc2.Handler) (connA *jsonrpc2.Conn, connB *jsonrpc2.Conn) {
|
||||
ctx := context.Background()
|
||||
connA, connB := net.Pipe()
|
||||
client = jsonrpc2.NewConn(
|
||||
ctx,
|
||||
jsonrpc2.NewPlainObjectStream(connA),
|
||||
noopHandler{},
|
||||
)
|
||||
server = jsonrpc2.NewConn(
|
||||
ctx,
|
||||
jsonrpc2.NewPlainObjectStream(connB),
|
||||
handler,
|
||||
)
|
||||
return client, server
|
||||
a, b := net.Pipe()
|
||||
connA = jsonrpc2.NewConn(ctx, jsonrpc2.NewPlainObjectStream(a), handlerA)
|
||||
connB = jsonrpc2.NewConn(ctx, jsonrpc2.NewPlainObjectStream(b), handlerB)
|
||||
return connA, connB
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue