Add channel test to lrpc
This commit is contained in:
parent
eadee97e5e
commit
c0a1c3bf43
77
lrpc_test.go
77
lrpc_test.go
@ -5,6 +5,7 @@ import (
|
|||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
"net"
|
"net"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"go.arsenm.dev/lrpc/client"
|
"go.arsenm.dev/lrpc/client"
|
||||||
"go.arsenm.dev/lrpc/codec"
|
"go.arsenm.dev/lrpc/codec"
|
||||||
@ -132,3 +133,79 @@ func TestCodecs(t *testing.T) {
|
|||||||
testCodec(codec.JSON, "json")
|
testCodec(codec.JSON, "json")
|
||||||
testCodec(codec.Gob, "gob")
|
testCodec(codec.Gob, "gob")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Channel struct{}
|
||||||
|
|
||||||
|
func (Channel) Time(ctx *server.Context, interval time.Duration) error {
|
||||||
|
ch, err := ctx.MakeChannel()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
tick := time.NewTicker(interval)
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case t := <-tick.C:
|
||||||
|
ch <- t
|
||||||
|
case <-ctx.Done():
|
||||||
|
close(ch)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestChannel(t *testing.T) {
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
// Create new network pipe
|
||||||
|
sConn, cConn := net.Pipe()
|
||||||
|
|
||||||
|
s := server.New()
|
||||||
|
defer s.Close()
|
||||||
|
// Register Arith for RPC
|
||||||
|
s.Register(Channel{})
|
||||||
|
// Serve the pipe connection using default codec
|
||||||
|
go s.ServeConn(ctx, sConn, codec.Default)
|
||||||
|
|
||||||
|
// Create new client using default codec
|
||||||
|
c := client.New(cConn, codec.Default)
|
||||||
|
defer c.Close()
|
||||||
|
|
||||||
|
timeCtx, timeCancel := context.WithCancel(ctx)
|
||||||
|
defer timeCancel()
|
||||||
|
|
||||||
|
timeCh := make(chan *time.Time, 2)
|
||||||
|
err := c.Call(timeCtx, "Channel", "Time", time.Millisecond, timeCh)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var loops int
|
||||||
|
var lastTime *time.Time
|
||||||
|
for curTime := range timeCh {
|
||||||
|
if loops > 3 {
|
||||||
|
timeCancel()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if lastTime == nil {
|
||||||
|
lastTime = curTime
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
diff := curTime.Sub(*lastTime)
|
||||||
|
diff = diff.Round(time.Millisecond)
|
||||||
|
|
||||||
|
if diff != time.Millisecond {
|
||||||
|
t.Fatalf("expected 1s diff, got %s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTime = curTime
|
||||||
|
loops++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user