-
Notifications
You must be signed in to change notification settings - Fork 384
/
service.go
105 lines (81 loc) · 1.95 KB
/
service.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package testutil
import (
context "context"
"testing"
"time"
"github.com/stretchr/testify/assert"
"go.uber.org/zap"
"google.golang.org/grpc"
"berty.tech/berty/v2/go/pkg/errcode"
"berty.tech/weshnet/pkg/grpcutil"
)
type service struct {
logger *zap.Logger
UnimplementedTestServiceServer
}
type Options struct {
Logger *zap.Logger
}
func (o *Options) applyDefault() {
if o.Logger == nil {
o.Logger = zap.NewNop()
}
}
func TestingNewServiceClient(ctx context.Context, t *testing.T, opts *Options) (*grpc.ClientConn, *grpc.Server) {
t.Helper()
srv := grpc.NewServer()
svc := NewService(opts)
RegisterTestServiceServer(srv, svc)
l := grpcutil.NewBufListener(2048)
cc, err := l.NewClientConn(ctx)
assert.NoError(t, err)
go func() {
_ = srv.Serve(l.Listener)
}()
t.Cleanup(func() { l.Close() })
return cc, srv
}
func NewService(opts *Options) TestServiceServer {
opts.applyDefault()
return &service{
logger: opts.Logger,
}
}
func (svc *service) EchoTest(ctx context.Context, req *EchoTest_Request) (*EchoTest_Reply, error) {
if req.TriggerError {
return nil, errcode.ErrTestEcho
}
if req.Delay > 0 {
time.Sleep(time.Duration(req.Delay) * time.Millisecond)
}
return &EchoTest_Reply{Echo: req.Echo}, nil
}
func (svc *service) EchoStreamTest(req *EchoStreamTest_Request, srv TestService_EchoStreamTestServer) error {
if req.TriggerError {
return errcode.ErrTestEcho
}
for {
err := srv.Send(&EchoStreamTest_Reply{Echo: req.Echo})
if err != nil {
return errcode.ErrTestEchoSend.Wrap(err)
}
time.Sleep(time.Duration(req.Delay) * time.Millisecond)
}
}
func (svc *service) EchoDuplexTest(srv TestService_EchoDuplexTestServer) error {
for {
req, err := srv.Recv()
if err != nil {
return errcode.ErrTestEchoRecv.Wrap(err)
}
if req.TriggerError {
return errcode.ErrTestEcho
}
err = srv.Send(&EchoDuplexTest_Reply{
Echo: req.Echo,
})
if err != nil {
return errcode.ErrTestEchoSend.Wrap(err)
}
}
}