Skip to content

Commit a6ca866

Browse files
speakyourcodesbinet
authored andcommitted
zmq4: router recv returns error when closing context
Fixes #58.
1 parent 68774bf commit a6ca866

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

router.go

+1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ func (q *routerQReader) read(ctx context.Context, msg *Msg) error {
146146
q.sem.lock()
147147
select {
148148
case <-ctx.Done():
149+
return ctx.Err()
149150
case *msg = <-q.c:
150151
}
151152
return msg.err

zmq4_routerdealer_test.go

+33
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"bytes"
99
"context"
1010
"fmt"
11+
"net"
1112
"reflect"
1213
"sync"
1314
"testing"
@@ -253,3 +254,35 @@ func TestRouterWithNoDealer(t *testing.T) {
253254
t.Fatalf("could not close router: %+v", err)
254255
}
255256
}
257+
258+
func TestRouterClose(t *testing.T) {
259+
ctx, cancel := context.WithCancel(context.Background())
260+
defer cancel()
261+
router := zmq4.NewRouter(ctx)
262+
err := router.Listen("tcp://*:*")
263+
if err != nil {
264+
t.Fatalf("router could not listen: %+v", err)
265+
}
266+
_, port, _ := net.SplitHostPort(router.Addr().String())
267+
dealer := zmq4.NewDealer(ctx)
268+
err = dealer.Dial("tcp://*:" + port)
269+
if err != nil {
270+
t.Fatalf("dealer could not dial: %+v", err)
271+
}
272+
273+
var wg sync.WaitGroup
274+
wg.Add(1)
275+
go func() {
276+
defer wg.Done()
277+
_, err := router.Recv()
278+
if err == nil {
279+
t.Errorf("expected error: context canceled")
280+
}
281+
}()
282+
283+
err = router.Close()
284+
if err != nil {
285+
t.Fatalf("could not close router: %+v", err)
286+
}
287+
wg.Wait()
288+
}

0 commit comments

Comments
 (0)