111 lines
2.3 KiB
Go
111 lines
2.3 KiB
Go
package server_test
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
|
|
"golang.org/x/net/context"
|
|
air "zombiezen.com/go/capnproto2/internal/aircraftlib"
|
|
. "zombiezen.com/go/capnproto2/server"
|
|
)
|
|
|
|
type echoImpl struct{}
|
|
|
|
func (echoImpl) Echo(call air.Echo_echo) error {
|
|
in, err := call.Params.In()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
call.Results.SetOut(in + in)
|
|
return nil
|
|
}
|
|
|
|
func TestServerCall(t *testing.T) {
|
|
echo := air.Echo_ServerToClient(echoImpl{})
|
|
defer func() {
|
|
if err := echo.Client.Close(); err != nil {
|
|
t.Error("Close:", err)
|
|
}
|
|
}()
|
|
|
|
result, err := echo.Echo(context.Background(), func(p air.Echo_echo_Params) error {
|
|
err := p.SetIn("foo")
|
|
return err
|
|
}).Struct()
|
|
|
|
if err != nil {
|
|
t.Errorf("echo.Echo() error: %v", err)
|
|
}
|
|
if out, err := result.Out(); err != nil {
|
|
t.Errorf("echo.Echo() error: %v", err)
|
|
} else if out != "foofoo" {
|
|
t.Errorf("echo.Echo() = %q; want %q", out, "foofoo")
|
|
}
|
|
}
|
|
|
|
type callSeq uint32
|
|
|
|
func (seq *callSeq) GetNumber(call air.CallSequence_getNumber) error {
|
|
call.Results.SetN(uint32(*seq))
|
|
*seq++
|
|
return nil
|
|
}
|
|
|
|
type lockCallSeq struct {
|
|
n uint32
|
|
mu sync.Mutex
|
|
}
|
|
|
|
func (seq *lockCallSeq) GetNumber(call air.CallSequence_getNumber) error {
|
|
seq.mu.Lock()
|
|
defer seq.mu.Unlock()
|
|
Ack(call.Options)
|
|
|
|
call.Results.SetN(seq.n)
|
|
seq.n++
|
|
return nil
|
|
}
|
|
|
|
func TestServerCallOrder(t *testing.T) {
|
|
seq := air.CallSequence_ServerToClient(new(callSeq))
|
|
testCallOrder(t, seq)
|
|
if err := seq.Client.Close(); err != nil {
|
|
t.Error("Close:", err)
|
|
}
|
|
}
|
|
|
|
func TestServerCallOrderWithCustomLocks(t *testing.T) {
|
|
seq := air.CallSequence_ServerToClient(new(lockCallSeq))
|
|
testCallOrder(t, seq)
|
|
if err := seq.Client.Close(); err != nil {
|
|
t.Error("Close:", err)
|
|
}
|
|
}
|
|
|
|
func testCallOrder(t *testing.T, seq air.CallSequence) {
|
|
ctx := context.Background()
|
|
send := func() air.CallSequence_getNumber_Results_Promise {
|
|
return seq.GetNumber(ctx, nil)
|
|
}
|
|
check := func(p air.CallSequence_getNumber_Results_Promise, n uint32) {
|
|
result, err := p.Struct()
|
|
if err != nil {
|
|
t.Errorf("seq.getNumber() error: %v; want %d", err, n)
|
|
} else if result.N() != n {
|
|
t.Errorf("seq.getNumber() = %d; want %d", result.N(), n)
|
|
}
|
|
}
|
|
|
|
call0 := send()
|
|
call1 := send()
|
|
call2 := send()
|
|
call3 := send()
|
|
call4 := send()
|
|
|
|
check(call0, 0)
|
|
check(call1, 1)
|
|
check(call2, 2)
|
|
check(call3, 3)
|
|
check(call4, 4)
|
|
}
|