53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
| package rpc_test
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 
 | |
| 	"golang.org/x/net/context"
 | |
| 	"zombiezen.com/go/capnproto2/rpc"
 | |
| 	"zombiezen.com/go/capnproto2/rpc/internal/logtransport"
 | |
| 	"zombiezen.com/go/capnproto2/rpc/internal/pipetransport"
 | |
| 	"zombiezen.com/go/capnproto2/rpc/internal/testcapnp"
 | |
| 	"zombiezen.com/go/capnproto2/server"
 | |
| )
 | |
| 
 | |
| func TestCancel(t *testing.T) {
 | |
| 	ctx, cancel := context.WithCancel(context.Background())
 | |
| 	defer cancel()
 | |
| 	log := testLogger{t}
 | |
| 	p, q := pipetransport.New()
 | |
| 	if *logMessages {
 | |
| 		p = logtransport.New(nil, p)
 | |
| 	}
 | |
| 	c := rpc.NewConn(p, rpc.ConnLog(log))
 | |
| 	notify := make(chan struct{})
 | |
| 	hanger := testcapnp.Hanger_ServerToClient(Hanger{notify: notify})
 | |
| 	d := rpc.NewConn(q, rpc.MainInterface(hanger.Client), rpc.ConnLog(log))
 | |
| 	defer d.Wait()
 | |
| 	defer c.Close()
 | |
| 	client := testcapnp.Hanger{Client: c.Bootstrap(ctx)}
 | |
| 
 | |
| 	subctx, subcancel := context.WithCancel(ctx)
 | |
| 	promise := client.Hang(subctx, nil)
 | |
| 	<-notify
 | |
| 	subcancel()
 | |
| 	_, err := promise.Struct()
 | |
| 	<-notify // test will deadlock if cancel not delivered
 | |
| 
 | |
| 	if err != context.Canceled {
 | |
| 		t.Errorf("promise.Get() error: %v; want %v", err, context.Canceled)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| type Hanger struct {
 | |
| 	notify chan struct{}
 | |
| }
 | |
| 
 | |
| func (h Hanger) Hang(call testcapnp.Hanger_hang) error {
 | |
| 	server.Ack(call.Options)
 | |
| 	h.notify <- struct{}{}
 | |
| 	<-call.Ctx.Done()
 | |
| 	close(h.notify)
 | |
| 	return nil
 | |
| }
 |