Bumping k8s dependencies to 1.13
This commit is contained in:
190
vendor/google.golang.org/grpc/test/balancer_test.go
generated
vendored
Normal file
190
vendor/google.golang.org/grpc/test/balancer_test.go
generated
vendored
Normal file
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"golang.org/x/net/context"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/balancer"
|
||||
"google.golang.org/grpc/connectivity"
|
||||
"google.golang.org/grpc/credentials"
|
||||
"google.golang.org/grpc/grpclog"
|
||||
"google.golang.org/grpc/internal/leakcheck"
|
||||
"google.golang.org/grpc/metadata"
|
||||
"google.golang.org/grpc/resolver"
|
||||
testpb "google.golang.org/grpc/test/grpc_testing"
|
||||
"google.golang.org/grpc/testdata"
|
||||
)
|
||||
|
||||
const testBalancerName = "testbalancer"
|
||||
|
||||
// testBalancer creates one subconn with the first address from resolved
|
||||
// addresses.
|
||||
//
|
||||
// It's used to test options for NewSubConn are applies correctly.
|
||||
type testBalancer struct {
|
||||
cc balancer.ClientConn
|
||||
sc balancer.SubConn
|
||||
|
||||
newSubConnOptions balancer.NewSubConnOptions
|
||||
pickOptions []balancer.PickOptions
|
||||
doneInfo []balancer.DoneInfo
|
||||
}
|
||||
|
||||
func (b *testBalancer) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer {
|
||||
b.cc = cc
|
||||
return b
|
||||
}
|
||||
|
||||
func (*testBalancer) Name() string {
|
||||
return testBalancerName
|
||||
}
|
||||
|
||||
func (b *testBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) {
|
||||
// Only create a subconn at the first time.
|
||||
if err == nil && b.sc == nil {
|
||||
b.sc, err = b.cc.NewSubConn(addrs, b.newSubConnOptions)
|
||||
if err != nil {
|
||||
grpclog.Errorf("testBalancer: failed to NewSubConn: %v", err)
|
||||
return
|
||||
}
|
||||
b.cc.UpdateBalancerState(connectivity.Idle, &picker{sc: b.sc, bal: b})
|
||||
b.sc.Connect()
|
||||
}
|
||||
}
|
||||
|
||||
func (b *testBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
|
||||
grpclog.Infof("testBalancer: HandleSubConnStateChange: %p, %v", sc, s)
|
||||
if b.sc != sc {
|
||||
grpclog.Infof("testBalancer: ignored state change because sc is not recognized")
|
||||
return
|
||||
}
|
||||
if s == connectivity.Shutdown {
|
||||
b.sc = nil
|
||||
return
|
||||
}
|
||||
|
||||
switch s {
|
||||
case connectivity.Ready, connectivity.Idle:
|
||||
b.cc.UpdateBalancerState(s, &picker{sc: sc, bal: b})
|
||||
case connectivity.Connecting:
|
||||
b.cc.UpdateBalancerState(s, &picker{err: balancer.ErrNoSubConnAvailable, bal: b})
|
||||
case connectivity.TransientFailure:
|
||||
b.cc.UpdateBalancerState(s, &picker{err: balancer.ErrTransientFailure, bal: b})
|
||||
}
|
||||
}
|
||||
|
||||
func (b *testBalancer) Close() {
|
||||
}
|
||||
|
||||
type picker struct {
|
||||
err error
|
||||
sc balancer.SubConn
|
||||
bal *testBalancer
|
||||
}
|
||||
|
||||
func (p *picker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
|
||||
p.bal.pickOptions = append(p.bal.pickOptions, opts)
|
||||
if p.err != nil {
|
||||
return nil, nil, p.err
|
||||
}
|
||||
return p.sc, func(d balancer.DoneInfo) { p.bal.doneInfo = append(p.bal.doneInfo, d) }, nil
|
||||
}
|
||||
|
||||
func TestCredsBundleFromBalancer(t *testing.T) {
|
||||
balancer.Register(&testBalancer{
|
||||
newSubConnOptions: balancer.NewSubConnOptions{
|
||||
CredsBundle: &testCredsBundle{},
|
||||
},
|
||||
})
|
||||
defer leakcheck.Check(t)
|
||||
te := newTest(t, env{name: "creds-bundle", network: "tcp", balancer: ""})
|
||||
te.tapHandle = authHandle
|
||||
te.customDialOptions = []grpc.DialOption{
|
||||
grpc.WithBalancerName(testBalancerName),
|
||||
}
|
||||
creds, err := credentials.NewServerTLSFromFile(testdata.Path("server1.pem"), testdata.Path("server1.key"))
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to generate credentials %v", err)
|
||||
}
|
||||
te.customServerOptions = []grpc.ServerOption{
|
||||
grpc.Creds(creds),
|
||||
}
|
||||
te.startServer(&testServer{})
|
||||
defer te.tearDown()
|
||||
|
||||
cc := te.clientConn()
|
||||
tc := testpb.NewTestServiceClient(cc)
|
||||
if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
|
||||
t.Fatalf("Test failed. Reason: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPickAndDone(t *testing.T) {
|
||||
defer leakcheck.Check(t)
|
||||
for _, e := range listTestEnv() {
|
||||
testPickAndDone(t, e)
|
||||
}
|
||||
}
|
||||
|
||||
func testPickAndDone(t *testing.T, e env) {
|
||||
te := newTest(t, e)
|
||||
b := &testBalancer{}
|
||||
balancer.Register(b)
|
||||
te.customDialOptions = []grpc.DialOption{
|
||||
grpc.WithBalancerName(testBalancerName),
|
||||
}
|
||||
te.userAgent = failAppUA
|
||||
te.startServer(&testServer{security: e.security})
|
||||
defer te.tearDown()
|
||||
|
||||
cc := te.clientConn()
|
||||
tc := testpb.NewTestServiceClient(cc)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
wantErr := detailedError
|
||||
if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); !reflect.DeepEqual(err, wantErr) {
|
||||
t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %v", err, wantErr)
|
||||
}
|
||||
md := metadata.Pairs("testMDKey", "testMDVal")
|
||||
ctx = metadata.NewOutgoingContext(ctx, md)
|
||||
if _, err := tc.UnaryCall(ctx, &testpb.SimpleRequest{}); err != nil {
|
||||
t.Fatalf("TestService.UnaryCall(%v, _, _, _) = _, %v; want _, <nil>", ctx, err)
|
||||
}
|
||||
|
||||
poWant := []balancer.PickOptions{
|
||||
{FullMethodName: "/grpc.testing.TestService/EmptyCall"},
|
||||
{FullMethodName: "/grpc.testing.TestService/UnaryCall", Header: md},
|
||||
}
|
||||
if !reflect.DeepEqual(b.pickOptions, poWant) {
|
||||
t.Fatalf("b.pickOptions = %v; want %v", b.pickOptions, poWant)
|
||||
}
|
||||
|
||||
if len(b.doneInfo) < 1 || !reflect.DeepEqual(b.doneInfo[0].Err, wantErr) {
|
||||
t.Fatalf("b.doneInfo = %v; want b.doneInfo[0].Err = %v", b.doneInfo, wantErr)
|
||||
}
|
||||
if len(b.doneInfo) < 2 || !reflect.DeepEqual(b.doneInfo[1].Trailer, testTrailerMetadata) {
|
||||
t.Fatalf("b.doneInfo = %v; want b.doneInfo[1].Trailer = %v", b.doneInfo, testTrailerMetadata)
|
||||
}
|
||||
}
|
100
vendor/google.golang.org/grpc/test/channelz_linux_go110_test.go
generated
vendored
Normal file
100
vendor/google.golang.org/grpc/test/channelz_linux_go110_test.go
generated
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
// +build go1.10,linux,!appengine
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
// The test in this file should be run in an environment that has go1.10 or later,
|
||||
// as the function SyscallConn() (required to get socket option) was
|
||||
// introduced to net.TCPListener in go1.10.
|
||||
|
||||
package test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"google.golang.org/grpc/internal/channelz"
|
||||
"google.golang.org/grpc/internal/leakcheck"
|
||||
testpb "google.golang.org/grpc/test/grpc_testing"
|
||||
)
|
||||
|
||||
func TestCZSocketMetricsSocketOption(t *testing.T) {
|
||||
envs := []env{tcpClearRREnv, tcpTLSRREnv}
|
||||
for _, e := range envs {
|
||||
testCZSocketMetricsSocketOption(t, e)
|
||||
}
|
||||
}
|
||||
|
||||
func testCZSocketMetricsSocketOption(t *testing.T, e env) {
|
||||
defer leakcheck.Check(t)
|
||||
channelz.NewChannelzStorage()
|
||||
te := newTest(t, e)
|
||||
te.startServer(&testServer{security: e.security})
|
||||
defer te.tearDown()
|
||||
cc := te.clientConn()
|
||||
tc := testpb.NewTestServiceClient(cc)
|
||||
doSuccessfulUnaryCall(tc, t)
|
||||
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
ss, _ := channelz.GetServers(0)
|
||||
if len(ss) != 1 {
|
||||
t.Fatalf("There should be one server, not %d", len(ss))
|
||||
}
|
||||
if len(ss[0].ListenSockets) != 1 {
|
||||
t.Fatalf("There should be one listen socket, not %d", len(ss[0].ListenSockets))
|
||||
}
|
||||
for id := range ss[0].ListenSockets {
|
||||
sm := channelz.GetSocket(id)
|
||||
if sm == nil || sm.SocketData == nil || sm.SocketData.SocketOptions == nil {
|
||||
t.Fatalf("Unable to get server listen socket options")
|
||||
}
|
||||
}
|
||||
ns, _ := channelz.GetServerSockets(ss[0].ID, 0)
|
||||
if len(ns) != 1 {
|
||||
t.Fatalf("There should be one server normal socket, not %d", len(ns))
|
||||
}
|
||||
if ns[0] == nil || ns[0].SocketData == nil || ns[0].SocketData.SocketOptions == nil {
|
||||
t.Fatalf("Unable to get server normal socket options")
|
||||
}
|
||||
|
||||
tchan, _ := channelz.GetTopChannels(0)
|
||||
if len(tchan) != 1 {
|
||||
t.Fatalf("There should only be one top channel, not %d", len(tchan))
|
||||
}
|
||||
if len(tchan[0].SubChans) != 1 {
|
||||
t.Fatalf("There should only be one subchannel under top channel %d, not %d", tchan[0].ID, len(tchan[0].SubChans))
|
||||
}
|
||||
var id int64
|
||||
for id = range tchan[0].SubChans {
|
||||
break
|
||||
}
|
||||
sc := channelz.GetSubChannel(id)
|
||||
if sc == nil {
|
||||
t.Fatalf("There should only be one socket under subchannel %d, not 0", id)
|
||||
}
|
||||
if len(sc.Sockets) != 1 {
|
||||
t.Fatalf("There should only be one socket under subchannel %d, not %d", sc.ID, len(sc.Sockets))
|
||||
}
|
||||
for id = range sc.Sockets {
|
||||
break
|
||||
}
|
||||
skt := channelz.GetSocket(id)
|
||||
if skt == nil || skt.SocketData == nil || skt.SocketData.SocketOptions == nil {
|
||||
t.Fatalf("Unable to get client normal socket options")
|
||||
}
|
||||
}
|
1835
vendor/google.golang.org/grpc/test/channelz_test.go
generated
vendored
Normal file
1835
vendor/google.golang.org/grpc/test/channelz_test.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
45
vendor/google.golang.org/grpc/test/codec_perf/perf.pb.go
generated
vendored
45
vendor/google.golang.org/grpc/test/codec_perf/perf.pb.go
generated
vendored
@@ -1,15 +1,6 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: codec_perf/perf.proto
|
||||
|
||||
/*
|
||||
Package codec_perf is a generated protocol buffer package.
|
||||
|
||||
It is generated from these files:
|
||||
codec_perf/perf.proto
|
||||
|
||||
It has these top-level messages:
|
||||
Buffer
|
||||
*/
|
||||
package codec_perf
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
@@ -30,13 +21,35 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||
// Buffer is a message that contains a body of bytes that is used to exercise
|
||||
// encoding and decoding overheads.
|
||||
type Buffer struct {
|
||||
Body []byte `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"`
|
||||
Body []byte `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Buffer) Reset() { *m = Buffer{} }
|
||||
func (m *Buffer) String() string { return proto.CompactTextString(m) }
|
||||
func (*Buffer) ProtoMessage() {}
|
||||
func (*Buffer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||
func (m *Buffer) Reset() { *m = Buffer{} }
|
||||
func (m *Buffer) String() string { return proto.CompactTextString(m) }
|
||||
func (*Buffer) ProtoMessage() {}
|
||||
func (*Buffer) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_perf_6cc81a33b24d08e7, []int{0}
|
||||
}
|
||||
func (m *Buffer) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Buffer.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Buffer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Buffer.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *Buffer) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Buffer.Merge(dst, src)
|
||||
}
|
||||
func (m *Buffer) XXX_Size() int {
|
||||
return xxx_messageInfo_Buffer.Size(m)
|
||||
}
|
||||
func (m *Buffer) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Buffer.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Buffer proto.InternalMessageInfo
|
||||
|
||||
func (m *Buffer) GetBody() []byte {
|
||||
if m != nil {
|
||||
@@ -49,9 +62,9 @@ func init() {
|
||||
proto.RegisterType((*Buffer)(nil), "codec.perf.Buffer")
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("codec_perf/perf.proto", fileDescriptor0) }
|
||||
func init() { proto.RegisterFile("codec_perf/perf.proto", fileDescriptor_perf_6cc81a33b24d08e7) }
|
||||
|
||||
var fileDescriptor0 = []byte{
|
||||
var fileDescriptor_perf_6cc81a33b24d08e7 = []byte{
|
||||
// 83 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0xce, 0x4f, 0x49,
|
||||
0x4d, 0x8e, 0x2f, 0x48, 0x2d, 0x4a, 0xd3, 0x07, 0x11, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42,
|
||||
|
131
vendor/google.golang.org/grpc/test/creds_test.go
generated
vendored
Normal file
131
vendor/google.golang.org/grpc/test/creds_test.go
generated
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package test
|
||||
|
||||
// TODO(https://github.com/grpc/grpc-go/issues/2330): move all creds releated
|
||||
// tests to this file.
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"golang.org/x/net/context"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials"
|
||||
"google.golang.org/grpc/internal/leakcheck"
|
||||
testpb "google.golang.org/grpc/test/grpc_testing"
|
||||
"google.golang.org/grpc/testdata"
|
||||
)
|
||||
|
||||
const (
|
||||
bundlePerRPCOnly = "perRPCOnly"
|
||||
bundleTLSOnly = "tlsOnly"
|
||||
)
|
||||
|
||||
type testCredsBundle struct {
|
||||
t *testing.T
|
||||
mode string
|
||||
}
|
||||
|
||||
func (c *testCredsBundle) TransportCredentials() credentials.TransportCredentials {
|
||||
if c.mode == bundlePerRPCOnly {
|
||||
return nil
|
||||
}
|
||||
|
||||
creds, err := credentials.NewClientTLSFromFile(testdata.Path("ca.pem"), "x.test.youtube.com")
|
||||
if err != nil {
|
||||
c.t.Logf("Failed to load credentials: %v", err)
|
||||
return nil
|
||||
}
|
||||
return creds
|
||||
}
|
||||
|
||||
func (c *testCredsBundle) PerRPCCredentials() credentials.PerRPCCredentials {
|
||||
if c.mode == bundleTLSOnly {
|
||||
return nil
|
||||
}
|
||||
return testPerRPCCredentials{}
|
||||
}
|
||||
|
||||
func (c *testCredsBundle) NewWithMode(mode string) (credentials.Bundle, error) {
|
||||
return &testCredsBundle{mode: mode}, nil
|
||||
}
|
||||
|
||||
func TestCredsBundleBoth(t *testing.T) {
|
||||
defer leakcheck.Check(t)
|
||||
te := newTest(t, env{name: "creds-bundle", network: "tcp", balancer: "v1", security: "empty"})
|
||||
te.tapHandle = authHandle
|
||||
te.customDialOptions = []grpc.DialOption{
|
||||
grpc.WithCredentialsBundle(&testCredsBundle{t: t}),
|
||||
}
|
||||
creds, err := credentials.NewServerTLSFromFile(testdata.Path("server1.pem"), testdata.Path("server1.key"))
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to generate credentials %v", err)
|
||||
}
|
||||
te.customServerOptions = []grpc.ServerOption{
|
||||
grpc.Creds(creds),
|
||||
}
|
||||
te.startServer(&testServer{})
|
||||
defer te.tearDown()
|
||||
|
||||
cc := te.clientConn()
|
||||
tc := testpb.NewTestServiceClient(cc)
|
||||
if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
|
||||
t.Fatalf("Test failed. Reason: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCredsBundleTransportCredentials(t *testing.T) {
|
||||
defer leakcheck.Check(t)
|
||||
te := newTest(t, env{name: "creds-bundle", network: "tcp", balancer: "v1", security: "empty"})
|
||||
te.customDialOptions = []grpc.DialOption{
|
||||
grpc.WithCredentialsBundle(&testCredsBundle{t: t, mode: bundleTLSOnly}),
|
||||
}
|
||||
creds, err := credentials.NewServerTLSFromFile(testdata.Path("server1.pem"), testdata.Path("server1.key"))
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to generate credentials %v", err)
|
||||
}
|
||||
te.customServerOptions = []grpc.ServerOption{
|
||||
grpc.Creds(creds),
|
||||
}
|
||||
te.startServer(&testServer{})
|
||||
defer te.tearDown()
|
||||
|
||||
cc := te.clientConn()
|
||||
tc := testpb.NewTestServiceClient(cc)
|
||||
if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
|
||||
t.Fatalf("Test failed. Reason: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCredsBundlePerRPCCredentials(t *testing.T) {
|
||||
defer leakcheck.Check(t)
|
||||
te := newTest(t, env{name: "creds-bundle", network: "tcp", balancer: "v1", security: "empty"})
|
||||
te.tapHandle = authHandle
|
||||
te.customDialOptions = []grpc.DialOption{
|
||||
grpc.WithCredentialsBundle(&testCredsBundle{t: t, mode: bundlePerRPCOnly}),
|
||||
}
|
||||
te.startServer(&testServer{})
|
||||
defer te.tearDown()
|
||||
|
||||
cc := te.clientConn()
|
||||
tc := testpb.NewTestServiceClient(cc)
|
||||
if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
|
||||
t.Fatalf("Test failed. Reason: %v", err)
|
||||
}
|
||||
}
|
1247
vendor/google.golang.org/grpc/test/end2end_test.go
generated
vendored
1247
vendor/google.golang.org/grpc/test/end2end_test.go
generated
vendored
File diff suppressed because it is too large
Load Diff
47
vendor/google.golang.org/grpc/test/go_vet/vet.go
generated
vendored
Normal file
47
vendor/google.golang.org/grpc/test/go_vet/vet.go
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
// vet.go is a script to check whether files that are supposed to be built on appengine import
|
||||
// unsupported package (e.g. "unsafe", "syscall") or not.
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go/build"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
b := build.Default
|
||||
b.BuildTags = []string{"appengine", "appenginevm"}
|
||||
argsWithoutProg := os.Args[1:]
|
||||
for _, dir := range argsWithoutProg {
|
||||
p, err := b.Import(".", dir, 0)
|
||||
if _, ok := err.(*build.NoGoError); ok {
|
||||
continue
|
||||
} else if err != nil {
|
||||
fmt.Printf("build.Import failed due to %v\n", err)
|
||||
continue
|
||||
}
|
||||
for _, pkg := range p.Imports {
|
||||
if pkg == "syscall" || pkg == "unsafe" {
|
||||
fmt.Printf("Package %s/%s importing %s package without appengine build tag is NOT ALLOWED!\n", p.Dir, p.Name, pkg)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
81
vendor/google.golang.org/grpc/test/gracefulstop_test.go
generated
vendored
81
vendor/google.golang.org/grpc/test/gracefulstop_test.go
generated
vendored
@@ -20,6 +20,7 @@ package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"sync"
|
||||
"testing"
|
||||
@@ -27,7 +28,7 @@ import (
|
||||
|
||||
"golang.org/x/net/context"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/test/leakcheck"
|
||||
"google.golang.org/grpc/internal/leakcheck"
|
||||
|
||||
testpb "google.golang.org/grpc/test/grpc_testing"
|
||||
)
|
||||
@@ -50,7 +51,12 @@ func (d *delayListener) Accept() (net.Conn, error) {
|
||||
return nil, fmt.Errorf("listener is closed")
|
||||
default:
|
||||
close(d.acceptCalled)
|
||||
return d.Listener.Accept()
|
||||
conn, err := d.Listener.Accept()
|
||||
// Allow closing of listener only after accept.
|
||||
// Note: Dial can return successfully, yet Accept
|
||||
// might now have finished.
|
||||
d.allowClose()
|
||||
return conn, err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,39 +92,19 @@ func (d *delayListener) Dial(to time.Duration) (net.Conn, error) {
|
||||
return d.cc, nil
|
||||
}
|
||||
|
||||
func (d *delayListener) clientWriteCalledChan() <-chan struct{} {
|
||||
return d.cc.writeCalledChan()
|
||||
}
|
||||
|
||||
type delayConn struct {
|
||||
net.Conn
|
||||
blockRead chan struct{}
|
||||
mu sync.Mutex
|
||||
writeCalled chan struct{}
|
||||
blockRead chan struct{}
|
||||
}
|
||||
|
||||
func (d *delayConn) writeCalledChan() <-chan struct{} {
|
||||
d.mu.Lock()
|
||||
defer d.mu.Unlock()
|
||||
d.writeCalled = make(chan struct{})
|
||||
return d.writeCalled
|
||||
}
|
||||
func (d *delayConn) allowRead() {
|
||||
close(d.blockRead)
|
||||
}
|
||||
|
||||
func (d *delayConn) Read(b []byte) (n int, err error) {
|
||||
<-d.blockRead
|
||||
return d.Conn.Read(b)
|
||||
}
|
||||
func (d *delayConn) Write(b []byte) (n int, err error) {
|
||||
d.mu.Lock()
|
||||
if d.writeCalled != nil {
|
||||
close(d.writeCalled)
|
||||
d.writeCalled = nil
|
||||
}
|
||||
d.mu.Unlock()
|
||||
return d.Conn.Write(b)
|
||||
}
|
||||
|
||||
func TestGracefulStop(t *testing.T) {
|
||||
defer leakcheck.Check(t)
|
||||
@@ -148,10 +134,16 @@ func TestGracefulStop(t *testing.T) {
|
||||
allowCloseCh: make(chan struct{}),
|
||||
}
|
||||
d := func(_ string, to time.Duration) (net.Conn, error) { return dlis.Dial(to) }
|
||||
serverGotReq := make(chan struct{})
|
||||
|
||||
ss := &stubServer{
|
||||
emptyCall: func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
|
||||
return &testpb.Empty{}, nil
|
||||
fullDuplexCall: func(stream testpb.TestService_FullDuplexCallServer) error {
|
||||
close(serverGotReq)
|
||||
_, err := stream.Recv()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return stream.Send(&testpb.StreamingOutputCallResponse{})
|
||||
},
|
||||
}
|
||||
s := grpc.NewServer()
|
||||
@@ -182,33 +174,38 @@ func TestGracefulStop(t *testing.T) {
|
||||
|
||||
// Now dial. The listener's Accept method will return a valid connection,
|
||||
// even though GracefulStop has closed the listener.
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
ctx, dialCancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer dialCancel()
|
||||
cc, err := grpc.DialContext(ctx, "", grpc.WithInsecure(), grpc.WithBlock(), grpc.WithDialer(d))
|
||||
if err != nil {
|
||||
t.Fatalf("grpc.Dial(%q) = %v", lis.Addr().String(), err)
|
||||
}
|
||||
cancel()
|
||||
client := testpb.NewTestServiceClient(cc)
|
||||
defer cc.Close()
|
||||
|
||||
dlis.allowClose()
|
||||
|
||||
wcch := dlis.clientWriteCalledChan()
|
||||
go func() {
|
||||
// 5. Allow the client to read the GoAway. The RPC should complete
|
||||
// successfully.
|
||||
<-wcch
|
||||
dlis.allowClientRead()
|
||||
}()
|
||||
|
||||
// 4. Send an RPC on the new connection.
|
||||
// The server would send a GOAWAY first, but we are delaying the server's
|
||||
// writes for now until the client writes more than the preface.
|
||||
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
|
||||
if _, err := client.EmptyCall(ctx, &testpb.Empty{}); err != nil {
|
||||
t.Fatalf("EmptyCall() = %v; want <nil>", err)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
stream, err := client.FullDuplexCall(ctx)
|
||||
if err != nil {
|
||||
t.Fatalf("FullDuplexCall= _, %v; want _, <nil>", err)
|
||||
}
|
||||
go func() {
|
||||
// 5. Allow the client to read the GoAway. The RPC should complete
|
||||
// successfully.
|
||||
<-serverGotReq
|
||||
dlis.allowClientRead()
|
||||
}()
|
||||
if err := stream.Send(&testpb.StreamingOutputCallRequest{}); err != nil {
|
||||
t.Fatalf("stream.Send(_) = %v, want <nil>", err)
|
||||
}
|
||||
if _, err := stream.Recv(); err != nil {
|
||||
t.Fatalf("stream.Recv() = _, %v, want _, <nil>", err)
|
||||
}
|
||||
if _, err := stream.Recv(); err != io.EOF {
|
||||
t.Fatalf("stream.Recv() = _, %v, want _, io.EOF", err)
|
||||
}
|
||||
|
||||
// 5. happens above, then we finish the call.
|
||||
cancel()
|
||||
wg.Wait()
|
||||
|
355
vendor/google.golang.org/grpc/test/grpc_testing/test.pb.go
generated
vendored
355
vendor/google.golang.org/grpc/test/grpc_testing/test.pb.go
generated
vendored
@@ -1,23 +1,6 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: grpc_testing/test.proto
|
||||
|
||||
/*
|
||||
Package grpc_testing is a generated protocol buffer package.
|
||||
|
||||
It is generated from these files:
|
||||
grpc_testing/test.proto
|
||||
|
||||
It has these top-level messages:
|
||||
Empty
|
||||
Payload
|
||||
SimpleRequest
|
||||
SimpleResponse
|
||||
StreamingInputCallRequest
|
||||
StreamingInputCallResponse
|
||||
ResponseParameters
|
||||
StreamingOutputCallRequest
|
||||
StreamingOutputCallResponse
|
||||
*/
|
||||
package grpc_testing
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
@@ -66,28 +49,74 @@ var PayloadType_value = map[string]int32{
|
||||
func (x PayloadType) String() string {
|
||||
return proto.EnumName(PayloadType_name, int32(x))
|
||||
}
|
||||
func (PayloadType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||
|
||||
type Empty struct {
|
||||
func (PayloadType) EnumDescriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{0}
|
||||
}
|
||||
|
||||
func (m *Empty) Reset() { *m = Empty{} }
|
||||
func (m *Empty) String() string { return proto.CompactTextString(m) }
|
||||
func (*Empty) ProtoMessage() {}
|
||||
func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||
type Empty struct {
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Empty) Reset() { *m = Empty{} }
|
||||
func (m *Empty) String() string { return proto.CompactTextString(m) }
|
||||
func (*Empty) ProtoMessage() {}
|
||||
func (*Empty) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{0}
|
||||
}
|
||||
func (m *Empty) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Empty.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Empty.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *Empty) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Empty.Merge(dst, src)
|
||||
}
|
||||
func (m *Empty) XXX_Size() int {
|
||||
return xxx_messageInfo_Empty.Size(m)
|
||||
}
|
||||
func (m *Empty) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Empty.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Empty proto.InternalMessageInfo
|
||||
|
||||
// A block of data, to simply increase gRPC message size.
|
||||
type Payload struct {
|
||||
// The type of data in body.
|
||||
Type PayloadType `protobuf:"varint,1,opt,name=type,enum=grpc.testing.PayloadType" json:"type,omitempty"`
|
||||
Type PayloadType `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.testing.PayloadType" json:"type,omitempty"`
|
||||
// Primary contents of payload.
|
||||
Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
|
||||
Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Payload) Reset() { *m = Payload{} }
|
||||
func (m *Payload) String() string { return proto.CompactTextString(m) }
|
||||
func (*Payload) ProtoMessage() {}
|
||||
func (*Payload) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||
func (m *Payload) Reset() { *m = Payload{} }
|
||||
func (m *Payload) String() string { return proto.CompactTextString(m) }
|
||||
func (*Payload) ProtoMessage() {}
|
||||
func (*Payload) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{1}
|
||||
}
|
||||
func (m *Payload) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Payload.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Payload) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Payload.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *Payload) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Payload.Merge(dst, src)
|
||||
}
|
||||
func (m *Payload) XXX_Size() int {
|
||||
return xxx_messageInfo_Payload.Size(m)
|
||||
}
|
||||
func (m *Payload) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Payload.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Payload proto.InternalMessageInfo
|
||||
|
||||
func (m *Payload) GetType() PayloadType {
|
||||
if m != nil {
|
||||
@@ -107,22 +136,44 @@ func (m *Payload) GetBody() []byte {
|
||||
type SimpleRequest struct {
|
||||
// Desired payload type in the response from the server.
|
||||
// If response_type is RANDOM, server randomly chooses one from other formats.
|
||||
ResponseType PayloadType `protobuf:"varint,1,opt,name=response_type,json=responseType,enum=grpc.testing.PayloadType" json:"response_type,omitempty"`
|
||||
ResponseType PayloadType `protobuf:"varint,1,opt,name=response_type,json=responseType,proto3,enum=grpc.testing.PayloadType" json:"response_type,omitempty"`
|
||||
// Desired payload size in the response from the server.
|
||||
// If response_type is COMPRESSABLE, this denotes the size before compression.
|
||||
ResponseSize int32 `protobuf:"varint,2,opt,name=response_size,json=responseSize" json:"response_size,omitempty"`
|
||||
ResponseSize int32 `protobuf:"varint,2,opt,name=response_size,json=responseSize,proto3" json:"response_size,omitempty"`
|
||||
// Optional input payload sent along with the request.
|
||||
Payload *Payload `protobuf:"bytes,3,opt,name=payload" json:"payload,omitempty"`
|
||||
Payload *Payload `protobuf:"bytes,3,opt,name=payload,proto3" json:"payload,omitempty"`
|
||||
// Whether SimpleResponse should include username.
|
||||
FillUsername bool `protobuf:"varint,4,opt,name=fill_username,json=fillUsername" json:"fill_username,omitempty"`
|
||||
FillUsername bool `protobuf:"varint,4,opt,name=fill_username,json=fillUsername,proto3" json:"fill_username,omitempty"`
|
||||
// Whether SimpleResponse should include OAuth scope.
|
||||
FillOauthScope bool `protobuf:"varint,5,opt,name=fill_oauth_scope,json=fillOauthScope" json:"fill_oauth_scope,omitempty"`
|
||||
FillOauthScope bool `protobuf:"varint,5,opt,name=fill_oauth_scope,json=fillOauthScope,proto3" json:"fill_oauth_scope,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *SimpleRequest) Reset() { *m = SimpleRequest{} }
|
||||
func (m *SimpleRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*SimpleRequest) ProtoMessage() {}
|
||||
func (*SimpleRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
|
||||
func (m *SimpleRequest) Reset() { *m = SimpleRequest{} }
|
||||
func (m *SimpleRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*SimpleRequest) ProtoMessage() {}
|
||||
func (*SimpleRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{2}
|
||||
}
|
||||
func (m *SimpleRequest) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_SimpleRequest.Unmarshal(m, b)
|
||||
}
|
||||
func (m *SimpleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_SimpleRequest.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *SimpleRequest) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_SimpleRequest.Merge(dst, src)
|
||||
}
|
||||
func (m *SimpleRequest) XXX_Size() int {
|
||||
return xxx_messageInfo_SimpleRequest.Size(m)
|
||||
}
|
||||
func (m *SimpleRequest) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_SimpleRequest.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_SimpleRequest proto.InternalMessageInfo
|
||||
|
||||
func (m *SimpleRequest) GetResponseType() PayloadType {
|
||||
if m != nil {
|
||||
@@ -162,18 +213,40 @@ func (m *SimpleRequest) GetFillOauthScope() bool {
|
||||
// Unary response, as configured by the request.
|
||||
type SimpleResponse struct {
|
||||
// Payload to increase message size.
|
||||
Payload *Payload `protobuf:"bytes,1,opt,name=payload" json:"payload,omitempty"`
|
||||
Payload *Payload `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
|
||||
// The user the request came from, for verifying authentication was
|
||||
// successful when the client expected it.
|
||||
Username string `protobuf:"bytes,2,opt,name=username" json:"username,omitempty"`
|
||||
Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"`
|
||||
// OAuth scope.
|
||||
OauthScope string `protobuf:"bytes,3,opt,name=oauth_scope,json=oauthScope" json:"oauth_scope,omitempty"`
|
||||
OauthScope string `protobuf:"bytes,3,opt,name=oauth_scope,json=oauthScope,proto3" json:"oauth_scope,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *SimpleResponse) Reset() { *m = SimpleResponse{} }
|
||||
func (m *SimpleResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*SimpleResponse) ProtoMessage() {}
|
||||
func (*SimpleResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
|
||||
func (m *SimpleResponse) Reset() { *m = SimpleResponse{} }
|
||||
func (m *SimpleResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*SimpleResponse) ProtoMessage() {}
|
||||
func (*SimpleResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{3}
|
||||
}
|
||||
func (m *SimpleResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_SimpleResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *SimpleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_SimpleResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *SimpleResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_SimpleResponse.Merge(dst, src)
|
||||
}
|
||||
func (m *SimpleResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_SimpleResponse.Size(m)
|
||||
}
|
||||
func (m *SimpleResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_SimpleResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_SimpleResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *SimpleResponse) GetPayload() *Payload {
|
||||
if m != nil {
|
||||
@@ -199,13 +272,35 @@ func (m *SimpleResponse) GetOauthScope() string {
|
||||
// Client-streaming request.
|
||||
type StreamingInputCallRequest struct {
|
||||
// Optional input payload sent along with the request.
|
||||
Payload *Payload `protobuf:"bytes,1,opt,name=payload" json:"payload,omitempty"`
|
||||
Payload *Payload `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *StreamingInputCallRequest) Reset() { *m = StreamingInputCallRequest{} }
|
||||
func (m *StreamingInputCallRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingInputCallRequest) ProtoMessage() {}
|
||||
func (*StreamingInputCallRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
|
||||
func (m *StreamingInputCallRequest) Reset() { *m = StreamingInputCallRequest{} }
|
||||
func (m *StreamingInputCallRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingInputCallRequest) ProtoMessage() {}
|
||||
func (*StreamingInputCallRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{4}
|
||||
}
|
||||
func (m *StreamingInputCallRequest) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_StreamingInputCallRequest.Unmarshal(m, b)
|
||||
}
|
||||
func (m *StreamingInputCallRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_StreamingInputCallRequest.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *StreamingInputCallRequest) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_StreamingInputCallRequest.Merge(dst, src)
|
||||
}
|
||||
func (m *StreamingInputCallRequest) XXX_Size() int {
|
||||
return xxx_messageInfo_StreamingInputCallRequest.Size(m)
|
||||
}
|
||||
func (m *StreamingInputCallRequest) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_StreamingInputCallRequest.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_StreamingInputCallRequest proto.InternalMessageInfo
|
||||
|
||||
func (m *StreamingInputCallRequest) GetPayload() *Payload {
|
||||
if m != nil {
|
||||
@@ -217,13 +312,35 @@ func (m *StreamingInputCallRequest) GetPayload() *Payload {
|
||||
// Client-streaming response.
|
||||
type StreamingInputCallResponse struct {
|
||||
// Aggregated size of payloads received from the client.
|
||||
AggregatedPayloadSize int32 `protobuf:"varint,1,opt,name=aggregated_payload_size,json=aggregatedPayloadSize" json:"aggregated_payload_size,omitempty"`
|
||||
AggregatedPayloadSize int32 `protobuf:"varint,1,opt,name=aggregated_payload_size,json=aggregatedPayloadSize,proto3" json:"aggregated_payload_size,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *StreamingInputCallResponse) Reset() { *m = StreamingInputCallResponse{} }
|
||||
func (m *StreamingInputCallResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingInputCallResponse) ProtoMessage() {}
|
||||
func (*StreamingInputCallResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
|
||||
func (m *StreamingInputCallResponse) Reset() { *m = StreamingInputCallResponse{} }
|
||||
func (m *StreamingInputCallResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingInputCallResponse) ProtoMessage() {}
|
||||
func (*StreamingInputCallResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{5}
|
||||
}
|
||||
func (m *StreamingInputCallResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_StreamingInputCallResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *StreamingInputCallResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_StreamingInputCallResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *StreamingInputCallResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_StreamingInputCallResponse.Merge(dst, src)
|
||||
}
|
||||
func (m *StreamingInputCallResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_StreamingInputCallResponse.Size(m)
|
||||
}
|
||||
func (m *StreamingInputCallResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_StreamingInputCallResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_StreamingInputCallResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *StreamingInputCallResponse) GetAggregatedPayloadSize() int32 {
|
||||
if m != nil {
|
||||
@@ -236,16 +353,38 @@ func (m *StreamingInputCallResponse) GetAggregatedPayloadSize() int32 {
|
||||
type ResponseParameters struct {
|
||||
// Desired payload sizes in responses from the server.
|
||||
// If response_type is COMPRESSABLE, this denotes the size before compression.
|
||||
Size int32 `protobuf:"varint,1,opt,name=size" json:"size,omitempty"`
|
||||
Size int32 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"`
|
||||
// Desired interval between consecutive responses in the response stream in
|
||||
// microseconds.
|
||||
IntervalUs int32 `protobuf:"varint,2,opt,name=interval_us,json=intervalUs" json:"interval_us,omitempty"`
|
||||
IntervalUs int32 `protobuf:"varint,2,opt,name=interval_us,json=intervalUs,proto3" json:"interval_us,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ResponseParameters) Reset() { *m = ResponseParameters{} }
|
||||
func (m *ResponseParameters) String() string { return proto.CompactTextString(m) }
|
||||
func (*ResponseParameters) ProtoMessage() {}
|
||||
func (*ResponseParameters) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
|
||||
func (m *ResponseParameters) Reset() { *m = ResponseParameters{} }
|
||||
func (m *ResponseParameters) String() string { return proto.CompactTextString(m) }
|
||||
func (*ResponseParameters) ProtoMessage() {}
|
||||
func (*ResponseParameters) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{6}
|
||||
}
|
||||
func (m *ResponseParameters) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_ResponseParameters.Unmarshal(m, b)
|
||||
}
|
||||
func (m *ResponseParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_ResponseParameters.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *ResponseParameters) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_ResponseParameters.Merge(dst, src)
|
||||
}
|
||||
func (m *ResponseParameters) XXX_Size() int {
|
||||
return xxx_messageInfo_ResponseParameters.Size(m)
|
||||
}
|
||||
func (m *ResponseParameters) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_ResponseParameters.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_ResponseParameters proto.InternalMessageInfo
|
||||
|
||||
func (m *ResponseParameters) GetSize() int32 {
|
||||
if m != nil {
|
||||
@@ -267,17 +406,39 @@ type StreamingOutputCallRequest struct {
|
||||
// If response_type is RANDOM, the payload from each response in the stream
|
||||
// might be of different types. This is to simulate a mixed type of payload
|
||||
// stream.
|
||||
ResponseType PayloadType `protobuf:"varint,1,opt,name=response_type,json=responseType,enum=grpc.testing.PayloadType" json:"response_type,omitempty"`
|
||||
ResponseType PayloadType `protobuf:"varint,1,opt,name=response_type,json=responseType,proto3,enum=grpc.testing.PayloadType" json:"response_type,omitempty"`
|
||||
// Configuration for each expected response message.
|
||||
ResponseParameters []*ResponseParameters `protobuf:"bytes,2,rep,name=response_parameters,json=responseParameters" json:"response_parameters,omitempty"`
|
||||
ResponseParameters []*ResponseParameters `protobuf:"bytes,2,rep,name=response_parameters,json=responseParameters,proto3" json:"response_parameters,omitempty"`
|
||||
// Optional input payload sent along with the request.
|
||||
Payload *Payload `protobuf:"bytes,3,opt,name=payload" json:"payload,omitempty"`
|
||||
Payload *Payload `protobuf:"bytes,3,opt,name=payload,proto3" json:"payload,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *StreamingOutputCallRequest) Reset() { *m = StreamingOutputCallRequest{} }
|
||||
func (m *StreamingOutputCallRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingOutputCallRequest) ProtoMessage() {}
|
||||
func (*StreamingOutputCallRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
|
||||
func (m *StreamingOutputCallRequest) Reset() { *m = StreamingOutputCallRequest{} }
|
||||
func (m *StreamingOutputCallRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingOutputCallRequest) ProtoMessage() {}
|
||||
func (*StreamingOutputCallRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{7}
|
||||
}
|
||||
func (m *StreamingOutputCallRequest) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_StreamingOutputCallRequest.Unmarshal(m, b)
|
||||
}
|
||||
func (m *StreamingOutputCallRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_StreamingOutputCallRequest.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *StreamingOutputCallRequest) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_StreamingOutputCallRequest.Merge(dst, src)
|
||||
}
|
||||
func (m *StreamingOutputCallRequest) XXX_Size() int {
|
||||
return xxx_messageInfo_StreamingOutputCallRequest.Size(m)
|
||||
}
|
||||
func (m *StreamingOutputCallRequest) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_StreamingOutputCallRequest.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_StreamingOutputCallRequest proto.InternalMessageInfo
|
||||
|
||||
func (m *StreamingOutputCallRequest) GetResponseType() PayloadType {
|
||||
if m != nil {
|
||||
@@ -303,13 +464,35 @@ func (m *StreamingOutputCallRequest) GetPayload() *Payload {
|
||||
// Server-streaming response, as configured by the request and parameters.
|
||||
type StreamingOutputCallResponse struct {
|
||||
// Payload to increase response size.
|
||||
Payload *Payload `protobuf:"bytes,1,opt,name=payload" json:"payload,omitempty"`
|
||||
Payload *Payload `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *StreamingOutputCallResponse) Reset() { *m = StreamingOutputCallResponse{} }
|
||||
func (m *StreamingOutputCallResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingOutputCallResponse) ProtoMessage() {}
|
||||
func (*StreamingOutputCallResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
|
||||
func (m *StreamingOutputCallResponse) Reset() { *m = StreamingOutputCallResponse{} }
|
||||
func (m *StreamingOutputCallResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*StreamingOutputCallResponse) ProtoMessage() {}
|
||||
func (*StreamingOutputCallResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_test_c9f6c5af4267cb88, []int{8}
|
||||
}
|
||||
func (m *StreamingOutputCallResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_StreamingOutputCallResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *StreamingOutputCallResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_StreamingOutputCallResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (dst *StreamingOutputCallResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_StreamingOutputCallResponse.Merge(dst, src)
|
||||
}
|
||||
func (m *StreamingOutputCallResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_StreamingOutputCallResponse.Size(m)
|
||||
}
|
||||
func (m *StreamingOutputCallResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_StreamingOutputCallResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_StreamingOutputCallResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *StreamingOutputCallResponse) GetPayload() *Payload {
|
||||
if m != nil {
|
||||
@@ -339,8 +522,9 @@ var _ grpc.ClientConn
|
||||
// is compatible with the grpc package it is being compiled against.
|
||||
const _ = grpc.SupportPackageIsVersion4
|
||||
|
||||
// Client API for TestService service
|
||||
|
||||
// TestServiceClient is the client API for TestService service.
|
||||
//
|
||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
|
||||
type TestServiceClient interface {
|
||||
// One empty request followed by one empty response.
|
||||
EmptyCall(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
|
||||
@@ -374,7 +558,7 @@ func NewTestServiceClient(cc *grpc.ClientConn) TestServiceClient {
|
||||
|
||||
func (c *testServiceClient) EmptyCall(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
|
||||
out := new(Empty)
|
||||
err := grpc.Invoke(ctx, "/grpc.testing.TestService/EmptyCall", in, out, c.cc, opts...)
|
||||
err := c.cc.Invoke(ctx, "/grpc.testing.TestService/EmptyCall", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -383,7 +567,7 @@ func (c *testServiceClient) EmptyCall(ctx context.Context, in *Empty, opts ...gr
|
||||
|
||||
func (c *testServiceClient) UnaryCall(ctx context.Context, in *SimpleRequest, opts ...grpc.CallOption) (*SimpleResponse, error) {
|
||||
out := new(SimpleResponse)
|
||||
err := grpc.Invoke(ctx, "/grpc.testing.TestService/UnaryCall", in, out, c.cc, opts...)
|
||||
err := c.cc.Invoke(ctx, "/grpc.testing.TestService/UnaryCall", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -391,7 +575,7 @@ func (c *testServiceClient) UnaryCall(ctx context.Context, in *SimpleRequest, op
|
||||
}
|
||||
|
||||
func (c *testServiceClient) StreamingOutputCall(ctx context.Context, in *StreamingOutputCallRequest, opts ...grpc.CallOption) (TestService_StreamingOutputCallClient, error) {
|
||||
stream, err := grpc.NewClientStream(ctx, &_TestService_serviceDesc.Streams[0], c.cc, "/grpc.testing.TestService/StreamingOutputCall", opts...)
|
||||
stream, err := c.cc.NewStream(ctx, &_TestService_serviceDesc.Streams[0], "/grpc.testing.TestService/StreamingOutputCall", opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -423,7 +607,7 @@ func (x *testServiceStreamingOutputCallClient) Recv() (*StreamingOutputCallRespo
|
||||
}
|
||||
|
||||
func (c *testServiceClient) StreamingInputCall(ctx context.Context, opts ...grpc.CallOption) (TestService_StreamingInputCallClient, error) {
|
||||
stream, err := grpc.NewClientStream(ctx, &_TestService_serviceDesc.Streams[1], c.cc, "/grpc.testing.TestService/StreamingInputCall", opts...)
|
||||
stream, err := c.cc.NewStream(ctx, &_TestService_serviceDesc.Streams[1], "/grpc.testing.TestService/StreamingInputCall", opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -457,7 +641,7 @@ func (x *testServiceStreamingInputCallClient) CloseAndRecv() (*StreamingInputCal
|
||||
}
|
||||
|
||||
func (c *testServiceClient) FullDuplexCall(ctx context.Context, opts ...grpc.CallOption) (TestService_FullDuplexCallClient, error) {
|
||||
stream, err := grpc.NewClientStream(ctx, &_TestService_serviceDesc.Streams[2], c.cc, "/grpc.testing.TestService/FullDuplexCall", opts...)
|
||||
stream, err := c.cc.NewStream(ctx, &_TestService_serviceDesc.Streams[2], "/grpc.testing.TestService/FullDuplexCall", opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -488,7 +672,7 @@ func (x *testServiceFullDuplexCallClient) Recv() (*StreamingOutputCallResponse,
|
||||
}
|
||||
|
||||
func (c *testServiceClient) HalfDuplexCall(ctx context.Context, opts ...grpc.CallOption) (TestService_HalfDuplexCallClient, error) {
|
||||
stream, err := grpc.NewClientStream(ctx, &_TestService_serviceDesc.Streams[3], c.cc, "/grpc.testing.TestService/HalfDuplexCall", opts...)
|
||||
stream, err := c.cc.NewStream(ctx, &_TestService_serviceDesc.Streams[3], "/grpc.testing.TestService/HalfDuplexCall", opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -518,8 +702,7 @@ func (x *testServiceHalfDuplexCallClient) Recv() (*StreamingOutputCallResponse,
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// Server API for TestService service
|
||||
|
||||
// TestServiceServer is the server API for TestService service.
|
||||
type TestServiceServer interface {
|
||||
// One empty request followed by one empty response.
|
||||
EmptyCall(context.Context, *Empty) (*Empty, error)
|
||||
@@ -722,9 +905,9 @@ var _TestService_serviceDesc = grpc.ServiceDesc{
|
||||
Metadata: "grpc_testing/test.proto",
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("grpc_testing/test.proto", fileDescriptor0) }
|
||||
func init() { proto.RegisterFile("grpc_testing/test.proto", fileDescriptor_test_c9f6c5af4267cb88) }
|
||||
|
||||
var fileDescriptor0 = []byte{
|
||||
var fileDescriptor_test_c9f6c5af4267cb88 = []byte{
|
||||
// 587 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xdb, 0x6e, 0xd3, 0x40,
|
||||
0x10, 0x65, 0xdb, 0xf4, 0x36, 0x49, 0xad, 0x68, 0xab, 0xaa, 0xae, 0x8b, 0x84, 0x65, 0x1e, 0x30,
|
||||
|
118
vendor/google.golang.org/grpc/test/leakcheck/leakcheck.go
generated
vendored
118
vendor/google.golang.org/grpc/test/leakcheck/leakcheck.go
generated
vendored
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2017 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
// Package leakcheck contains functions to check leaked goroutines.
|
||||
//
|
||||
// Call "defer leakcheck.Check(t)" at the beginning of tests.
|
||||
package leakcheck
|
||||
|
||||
import (
|
||||
"runtime"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var goroutinesToIgnore = []string{
|
||||
"testing.Main(",
|
||||
"testing.tRunner(",
|
||||
"testing.(*M).",
|
||||
"runtime.goexit",
|
||||
"created by runtime.gc",
|
||||
"created by runtime/trace.Start",
|
||||
"interestingGoroutines",
|
||||
"runtime.MHeap_Scavenger",
|
||||
"signal.signal_recv",
|
||||
"sigterm.handler",
|
||||
"runtime_mcall",
|
||||
"(*loggingT).flushDaemon",
|
||||
"goroutine in C code",
|
||||
}
|
||||
|
||||
// RegisterIgnoreGoroutine appends s into the ignore goroutine list. The
|
||||
// goroutines whose stack trace contains s will not be identified as leaked
|
||||
// goroutines. Not thread-safe, only call this function in init().
|
||||
func RegisterIgnoreGoroutine(s string) {
|
||||
goroutinesToIgnore = append(goroutinesToIgnore, s)
|
||||
}
|
||||
|
||||
func ignore(g string) bool {
|
||||
sl := strings.SplitN(g, "\n", 2)
|
||||
if len(sl) != 2 {
|
||||
return true
|
||||
}
|
||||
stack := strings.TrimSpace(sl[1])
|
||||
if strings.HasPrefix(stack, "testing.RunTests") {
|
||||
return true
|
||||
}
|
||||
|
||||
if stack == "" {
|
||||
return true
|
||||
}
|
||||
|
||||
for _, s := range goroutinesToIgnore {
|
||||
if strings.Contains(stack, s) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// interestingGoroutines returns all goroutines we care about for the purpose of
|
||||
// leak checking. It excludes testing or runtime ones.
|
||||
func interestingGoroutines() (gs []string) {
|
||||
buf := make([]byte, 2<<20)
|
||||
buf = buf[:runtime.Stack(buf, true)]
|
||||
for _, g := range strings.Split(string(buf), "\n\n") {
|
||||
if !ignore(g) {
|
||||
gs = append(gs, g)
|
||||
}
|
||||
}
|
||||
sort.Strings(gs)
|
||||
return
|
||||
}
|
||||
|
||||
// Errorfer is the interface that wraps the Errorf method. It's a subset of
|
||||
// testing.TB to make it easy to use Check.
|
||||
type Errorfer interface {
|
||||
Errorf(format string, args ...interface{})
|
||||
}
|
||||
|
||||
func check(efer Errorfer, timeout time.Duration) {
|
||||
// Loop, waiting for goroutines to shut down.
|
||||
// Wait up to timeout, but finish as quickly as possible.
|
||||
deadline := time.Now().Add(timeout)
|
||||
var leaked []string
|
||||
for time.Now().Before(deadline) {
|
||||
if leaked = interestingGoroutines(); len(leaked) == 0 {
|
||||
return
|
||||
}
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
}
|
||||
for _, g := range leaked {
|
||||
efer.Errorf("Leaked goroutine: %v", g)
|
||||
}
|
||||
}
|
||||
|
||||
// Check looks at the currently-running goroutines and checks if there are any
|
||||
// interestring (created by gRPC) goroutines leaked. It waits up to 10 seconds
|
||||
// in the error cases.
|
||||
func Check(efer Errorfer) {
|
||||
check(efer, 10*time.Second)
|
||||
}
|
76
vendor/google.golang.org/grpc/test/leakcheck/leakcheck_test.go
generated
vendored
76
vendor/google.golang.org/grpc/test/leakcheck/leakcheck_test.go
generated
vendored
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2017 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package leakcheck
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
type testErrorfer struct {
|
||||
errorCount int
|
||||
errors []string
|
||||
}
|
||||
|
||||
func (e *testErrorfer) Errorf(format string, args ...interface{}) {
|
||||
e.errors = append(e.errors, fmt.Sprintf(format, args...))
|
||||
e.errorCount++
|
||||
}
|
||||
|
||||
func TestCheck(t *testing.T) {
|
||||
const leakCount = 3
|
||||
for i := 0; i < leakCount; i++ {
|
||||
go func() { time.Sleep(2 * time.Second) }()
|
||||
}
|
||||
if ig := interestingGoroutines(); len(ig) == 0 {
|
||||
t.Error("blah")
|
||||
}
|
||||
e := &testErrorfer{}
|
||||
check(e, time.Second)
|
||||
if e.errorCount != leakCount {
|
||||
t.Errorf("check found %v leaks, want %v leaks", e.errorCount, leakCount)
|
||||
t.Logf("leaked goroutines:\n%v", strings.Join(e.errors, "\n"))
|
||||
}
|
||||
check(t, 3*time.Second)
|
||||
}
|
||||
|
||||
func ignoredTestingLeak(d time.Duration) {
|
||||
time.Sleep(d)
|
||||
}
|
||||
|
||||
func TestCheckRegisterIgnore(t *testing.T) {
|
||||
RegisterIgnoreGoroutine("ignoredTestingLeak")
|
||||
const leakCount = 3
|
||||
for i := 0; i < leakCount; i++ {
|
||||
go func() { time.Sleep(2 * time.Second) }()
|
||||
}
|
||||
go func() { ignoredTestingLeak(3 * time.Second) }()
|
||||
if ig := interestingGoroutines(); len(ig) == 0 {
|
||||
t.Error("blah")
|
||||
}
|
||||
e := &testErrorfer{}
|
||||
check(e, time.Second)
|
||||
if e.errorCount != leakCount {
|
||||
t.Errorf("check found %v leaks, want %v leaks", e.errorCount, leakCount)
|
||||
t.Logf("leaked goroutines:\n%v", strings.Join(e.errors, "\n"))
|
||||
}
|
||||
check(t, 3*time.Second)
|
||||
}
|
345
vendor/google.golang.org/grpc/test/rawConnWrapper.go
generated
vendored
Normal file
345
vendor/google.golang.org/grpc/test/rawConnWrapper.go
generated
vendored
Normal file
@@ -0,0 +1,345 @@
|
||||
/*
|
||||
* Copyright 2018 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"golang.org/x/net/http2"
|
||||
"golang.org/x/net/http2/hpack"
|
||||
)
|
||||
|
||||
type listenerWrapper struct {
|
||||
net.Listener
|
||||
mu sync.Mutex
|
||||
rcw *rawConnWrapper
|
||||
}
|
||||
|
||||
func listenWithConnControl(network, address string) (net.Listener, error) {
|
||||
l, err := net.Listen(network, address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &listenerWrapper{Listener: l}, nil
|
||||
}
|
||||
|
||||
// Accept blocks until Dial is called, then returns a net.Conn for the server
|
||||
// half of the connection.
|
||||
func (l *listenerWrapper) Accept() (net.Conn, error) {
|
||||
c, err := l.Listener.Accept()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
l.mu.Lock()
|
||||
l.rcw = newRawConnWrapperFromConn(c)
|
||||
l.mu.Unlock()
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (l *listenerWrapper) getLastConn() *rawConnWrapper {
|
||||
l.mu.Lock()
|
||||
defer l.mu.Unlock()
|
||||
return l.rcw
|
||||
}
|
||||
|
||||
type dialerWrapper struct {
|
||||
c net.Conn
|
||||
rcw *rawConnWrapper
|
||||
}
|
||||
|
||||
func (d *dialerWrapper) dialer(target string, t time.Duration) (net.Conn, error) {
|
||||
c, err := net.DialTimeout("tcp", target, t)
|
||||
d.c = c
|
||||
d.rcw = newRawConnWrapperFromConn(c)
|
||||
return c, err
|
||||
}
|
||||
|
||||
func (d *dialerWrapper) getRawConnWrapper() *rawConnWrapper {
|
||||
return d.rcw
|
||||
}
|
||||
|
||||
type rawConnWrapper struct {
|
||||
cc io.ReadWriteCloser
|
||||
fr *http2.Framer
|
||||
|
||||
// writing headers:
|
||||
headerBuf bytes.Buffer
|
||||
hpackEnc *hpack.Encoder
|
||||
|
||||
// reading frames:
|
||||
frc chan http2.Frame
|
||||
frErrc chan error
|
||||
readTimer *time.Timer
|
||||
}
|
||||
|
||||
func newRawConnWrapperFromConn(cc io.ReadWriteCloser) *rawConnWrapper {
|
||||
rcw := &rawConnWrapper{
|
||||
cc: cc,
|
||||
frc: make(chan http2.Frame, 1),
|
||||
frErrc: make(chan error, 1),
|
||||
}
|
||||
rcw.hpackEnc = hpack.NewEncoder(&rcw.headerBuf)
|
||||
rcw.fr = http2.NewFramer(cc, cc)
|
||||
rcw.fr.ReadMetaHeaders = hpack.NewDecoder(4096 /*initialHeaderTableSize*/, nil)
|
||||
|
||||
return rcw
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) Close() error {
|
||||
return rcw.cc.Close()
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) readFrame() (http2.Frame, error) {
|
||||
go func() {
|
||||
fr, err := rcw.fr.ReadFrame()
|
||||
if err != nil {
|
||||
rcw.frErrc <- err
|
||||
} else {
|
||||
rcw.frc <- fr
|
||||
}
|
||||
}()
|
||||
t := time.NewTimer(2 * time.Second)
|
||||
defer t.Stop()
|
||||
select {
|
||||
case f := <-rcw.frc:
|
||||
return f, nil
|
||||
case err := <-rcw.frErrc:
|
||||
return nil, err
|
||||
case <-t.C:
|
||||
return nil, fmt.Errorf("timeout waiting for frame")
|
||||
}
|
||||
}
|
||||
|
||||
// greet initiates the client's HTTP/2 connection into a state where
|
||||
// frames may be sent.
|
||||
func (rcw *rawConnWrapper) greet() error {
|
||||
rcw.writePreface()
|
||||
rcw.writeInitialSettings()
|
||||
rcw.wantSettings()
|
||||
rcw.writeSettingsAck()
|
||||
for {
|
||||
f, err := rcw.readFrame()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch f := f.(type) {
|
||||
case *http2.WindowUpdateFrame:
|
||||
// grpc's transport/http2_server sends this
|
||||
// before the settings ack. The Go http2
|
||||
// server uses a setting instead.
|
||||
case *http2.SettingsFrame:
|
||||
if f.IsAck() {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("during greet, got non-ACK settings frame")
|
||||
default:
|
||||
return fmt.Errorf("during greet, unexpected frame type %T", f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writePreface() error {
|
||||
n, err := rcw.cc.Write([]byte(http2.ClientPreface))
|
||||
if err != nil {
|
||||
return fmt.Errorf("error writing client preface: %v", err)
|
||||
}
|
||||
if n != len(http2.ClientPreface) {
|
||||
return fmt.Errorf("writing client preface, wrote %d bytes; want %d", n, len(http2.ClientPreface))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writeInitialSettings() error {
|
||||
if err := rcw.fr.WriteSettings(); err != nil {
|
||||
return fmt.Errorf("error writing initial SETTINGS frame from client to server: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writeSettingsAck() error {
|
||||
if err := rcw.fr.WriteSettingsAck(); err != nil {
|
||||
return fmt.Errorf("error writing ACK of server's SETTINGS: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) wantSettings() (*http2.SettingsFrame, error) {
|
||||
f, err := rcw.readFrame()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error while expecting a SETTINGS frame: %v", err)
|
||||
}
|
||||
sf, ok := f.(*http2.SettingsFrame)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("got a %T; want *SettingsFrame", f)
|
||||
}
|
||||
return sf, nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) wantSettingsAck() error {
|
||||
f, err := rcw.readFrame()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sf, ok := f.(*http2.SettingsFrame)
|
||||
if !ok {
|
||||
return fmt.Errorf("wanting a settings ACK, received a %T", f)
|
||||
}
|
||||
if !sf.IsAck() {
|
||||
return fmt.Errorf("settings Frame didn't have ACK set")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// wait for any activity from the server
|
||||
func (rcw *rawConnWrapper) wantAnyFrame() (http2.Frame, error) {
|
||||
f, err := rcw.fr.ReadFrame()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return f, nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) encodeHeaderField(k, v string) error {
|
||||
err := rcw.hpackEnc.WriteField(hpack.HeaderField{Name: k, Value: v})
|
||||
if err != nil {
|
||||
return fmt.Errorf("HPACK encoding error for %q/%q: %v", k, v, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// encodeHeader encodes headers and returns their HPACK bytes. headers
|
||||
// must contain an even number of key/value pairs. There may be
|
||||
// multiple pairs for keys (e.g. "cookie"). The :method, :path, and
|
||||
// :scheme headers default to GET, / and https.
|
||||
func (rcw *rawConnWrapper) encodeHeader(headers ...string) []byte {
|
||||
if len(headers)%2 == 1 {
|
||||
panic("odd number of kv args")
|
||||
}
|
||||
|
||||
rcw.headerBuf.Reset()
|
||||
|
||||
if len(headers) == 0 {
|
||||
// Fast path, mostly for benchmarks, so test code doesn't pollute
|
||||
// profiles when we're looking to improve server allocations.
|
||||
rcw.encodeHeaderField(":method", "GET")
|
||||
rcw.encodeHeaderField(":path", "/")
|
||||
rcw.encodeHeaderField(":scheme", "https")
|
||||
return rcw.headerBuf.Bytes()
|
||||
}
|
||||
|
||||
if len(headers) == 2 && headers[0] == ":method" {
|
||||
// Another fast path for benchmarks.
|
||||
rcw.encodeHeaderField(":method", headers[1])
|
||||
rcw.encodeHeaderField(":path", "/")
|
||||
rcw.encodeHeaderField(":scheme", "https")
|
||||
return rcw.headerBuf.Bytes()
|
||||
}
|
||||
|
||||
pseudoCount := map[string]int{}
|
||||
keys := []string{":method", ":path", ":scheme"}
|
||||
vals := map[string][]string{
|
||||
":method": {"GET"},
|
||||
":path": {"/"},
|
||||
":scheme": {"https"},
|
||||
}
|
||||
for len(headers) > 0 {
|
||||
k, v := headers[0], headers[1]
|
||||
headers = headers[2:]
|
||||
if _, ok := vals[k]; !ok {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
if strings.HasPrefix(k, ":") {
|
||||
pseudoCount[k]++
|
||||
if pseudoCount[k] == 1 {
|
||||
vals[k] = []string{v}
|
||||
} else {
|
||||
// Allows testing of invalid headers w/ dup pseudo fields.
|
||||
vals[k] = append(vals[k], v)
|
||||
}
|
||||
} else {
|
||||
vals[k] = append(vals[k], v)
|
||||
}
|
||||
}
|
||||
for _, k := range keys {
|
||||
for _, v := range vals[k] {
|
||||
rcw.encodeHeaderField(k, v)
|
||||
}
|
||||
}
|
||||
return rcw.headerBuf.Bytes()
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writeHeadersGRPC(streamID uint32, path string) {
|
||||
rcw.writeHeaders(http2.HeadersFrameParam{
|
||||
StreamID: streamID,
|
||||
BlockFragment: rcw.encodeHeader(
|
||||
":method", "POST",
|
||||
":path", path,
|
||||
"content-type", "application/grpc",
|
||||
"te", "trailers",
|
||||
),
|
||||
EndStream: false,
|
||||
EndHeaders: true,
|
||||
})
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writeHeaders(p http2.HeadersFrameParam) error {
|
||||
if err := rcw.fr.WriteHeaders(p); err != nil {
|
||||
return fmt.Errorf("error writing HEADERS: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writeData(streamID uint32, endStream bool, data []byte) error {
|
||||
if err := rcw.fr.WriteData(streamID, endStream, data); err != nil {
|
||||
return fmt.Errorf("error writing DATA: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writeRSTStream(streamID uint32, code http2.ErrCode) error {
|
||||
if err := rcw.fr.WriteRSTStream(streamID, code); err != nil {
|
||||
return fmt.Errorf("error writing RST_STREAM: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writeDataPadded(streamID uint32, endStream bool, data, padding []byte) error {
|
||||
if err := rcw.fr.WriteDataPadded(streamID, endStream, data, padding); err != nil {
|
||||
return fmt.Errorf("error writing DATA with padding: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writeGoAway(maxStreamID uint32, code http2.ErrCode, debugData []byte) error {
|
||||
if err := rcw.fr.WriteGoAway(maxStreamID, code, debugData); err != nil {
|
||||
return fmt.Errorf("error writing GoAway: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcw *rawConnWrapper) writeRawFrame(t http2.FrameType, flags http2.Flags, streamID uint32, payload []byte) error {
|
||||
if err := rcw.fr.WriteRawFrame(t, flags, streamID, payload); err != nil {
|
||||
return fmt.Errorf("error writing Raw Frame: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
551
vendor/google.golang.org/grpc/test/retry_test.go
generated
vendored
Normal file
551
vendor/google.golang.org/grpc/test/retry_test.go
generated
vendored
Normal file
@@ -0,0 +1,551 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
"golang.org/x/net/context"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/internal/envconfig"
|
||||
"google.golang.org/grpc/metadata"
|
||||
"google.golang.org/grpc/status"
|
||||
testpb "google.golang.org/grpc/test/grpc_testing"
|
||||
)
|
||||
|
||||
func enableRetry() func() {
|
||||
old := envconfig.Retry
|
||||
envconfig.Retry = true
|
||||
return func() { envconfig.Retry = old }
|
||||
}
|
||||
|
||||
func TestRetryUnary(t *testing.T) {
|
||||
defer enableRetry()()
|
||||
i := -1
|
||||
ss := &stubServer{
|
||||
emptyCall: func(context.Context, *testpb.Empty) (*testpb.Empty, error) {
|
||||
i++
|
||||
switch i {
|
||||
case 0, 2, 5:
|
||||
return &testpb.Empty{}, nil
|
||||
case 6, 8, 11:
|
||||
return nil, status.New(codes.Internal, "non-retryable error").Err()
|
||||
}
|
||||
return nil, status.New(codes.AlreadyExists, "retryable error").Err()
|
||||
},
|
||||
}
|
||||
if err := ss.Start([]grpc.ServerOption{}); err != nil {
|
||||
t.Fatalf("Error starting endpoint server: %v", err)
|
||||
}
|
||||
defer ss.Stop()
|
||||
ss.r.NewServiceConfig(`{
|
||||
"methodConfig": [{
|
||||
"name": [{"service": "grpc.testing.TestService"}],
|
||||
"waitForReady": true,
|
||||
"retryPolicy": {
|
||||
"MaxAttempts": 4,
|
||||
"InitialBackoff": ".01s",
|
||||
"MaxBackoff": ".01s",
|
||||
"BackoffMultiplier": 1.0,
|
||||
"RetryableStatusCodes": [ "ALREADY_EXISTS" ]
|
||||
}
|
||||
}]}`)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
||||
for {
|
||||
if ctx.Err() != nil {
|
||||
t.Fatalf("Timed out waiting for service config update")
|
||||
}
|
||||
if ss.cc.GetMethodConfig("/grpc.testing.TestService/EmptyCall").WaitForReady != nil {
|
||||
break
|
||||
}
|
||||
time.Sleep(time.Millisecond)
|
||||
}
|
||||
cancel()
|
||||
|
||||
testCases := []struct {
|
||||
code codes.Code
|
||||
count int
|
||||
}{
|
||||
{codes.OK, 0},
|
||||
{codes.OK, 2},
|
||||
{codes.OK, 5},
|
||||
{codes.Internal, 6},
|
||||
{codes.Internal, 8},
|
||||
{codes.Internal, 11},
|
||||
{codes.AlreadyExists, 15},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
_, err := ss.client.EmptyCall(ctx, &testpb.Empty{})
|
||||
cancel()
|
||||
if status.Code(err) != tc.code {
|
||||
t.Fatalf("EmptyCall(_, _) = _, %v; want _, <Code() = %v>", err, tc.code)
|
||||
}
|
||||
if i != tc.count {
|
||||
t.Fatalf("i = %v; want %v", i, tc.count)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestRetryDisabledByDefault(t *testing.T) {
|
||||
if strings.EqualFold(os.Getenv("GRPC_GO_RETRY"), "on") {
|
||||
return
|
||||
}
|
||||
i := -1
|
||||
ss := &stubServer{
|
||||
emptyCall: func(context.Context, *testpb.Empty) (*testpb.Empty, error) {
|
||||
i++
|
||||
switch i {
|
||||
case 0:
|
||||
return nil, status.New(codes.AlreadyExists, "retryable error").Err()
|
||||
}
|
||||
return &testpb.Empty{}, nil
|
||||
},
|
||||
}
|
||||
if err := ss.Start([]grpc.ServerOption{}); err != nil {
|
||||
t.Fatalf("Error starting endpoint server: %v", err)
|
||||
}
|
||||
defer ss.Stop()
|
||||
ss.r.NewServiceConfig(`{
|
||||
"methodConfig": [{
|
||||
"name": [{"service": "grpc.testing.TestService"}],
|
||||
"waitForReady": true,
|
||||
"retryPolicy": {
|
||||
"MaxAttempts": 4,
|
||||
"InitialBackoff": ".01s",
|
||||
"MaxBackoff": ".01s",
|
||||
"BackoffMultiplier": 1.0,
|
||||
"RetryableStatusCodes": [ "ALREADY_EXISTS" ]
|
||||
}
|
||||
}]}`)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
||||
for {
|
||||
if ctx.Err() != nil {
|
||||
t.Fatalf("Timed out waiting for service config update")
|
||||
}
|
||||
if ss.cc.GetMethodConfig("/grpc.testing.TestService/EmptyCall").WaitForReady != nil {
|
||||
break
|
||||
}
|
||||
time.Sleep(time.Millisecond)
|
||||
}
|
||||
cancel()
|
||||
|
||||
testCases := []struct {
|
||||
code codes.Code
|
||||
count int
|
||||
}{
|
||||
{codes.AlreadyExists, 0},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
_, err := ss.client.EmptyCall(ctx, &testpb.Empty{})
|
||||
cancel()
|
||||
if status.Code(err) != tc.code {
|
||||
t.Fatalf("EmptyCall(_, _) = _, %v; want _, <Code() = %v>", err, tc.code)
|
||||
}
|
||||
if i != tc.count {
|
||||
t.Fatalf("i = %v; want %v", i, tc.count)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestRetryThrottling(t *testing.T) {
|
||||
defer enableRetry()()
|
||||
i := -1
|
||||
ss := &stubServer{
|
||||
emptyCall: func(context.Context, *testpb.Empty) (*testpb.Empty, error) {
|
||||
i++
|
||||
switch i {
|
||||
case 0, 3, 6, 10, 11, 12, 13, 14, 16, 18:
|
||||
return &testpb.Empty{}, nil
|
||||
}
|
||||
return nil, status.New(codes.Unavailable, "retryable error").Err()
|
||||
},
|
||||
}
|
||||
if err := ss.Start([]grpc.ServerOption{}); err != nil {
|
||||
t.Fatalf("Error starting endpoint server: %v", err)
|
||||
}
|
||||
defer ss.Stop()
|
||||
ss.r.NewServiceConfig(`{
|
||||
"methodConfig": [{
|
||||
"name": [{"service": "grpc.testing.TestService"}],
|
||||
"waitForReady": true,
|
||||
"retryPolicy": {
|
||||
"MaxAttempts": 4,
|
||||
"InitialBackoff": ".01s",
|
||||
"MaxBackoff": ".01s",
|
||||
"BackoffMultiplier": 1.0,
|
||||
"RetryableStatusCodes": [ "UNAVAILABLE" ]
|
||||
}
|
||||
}],
|
||||
"retryThrottling": {
|
||||
"maxTokens": 10,
|
||||
"tokenRatio": 0.5
|
||||
}
|
||||
}`)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
||||
for {
|
||||
if ctx.Err() != nil {
|
||||
t.Fatalf("Timed out waiting for service config update")
|
||||
}
|
||||
if ss.cc.GetMethodConfig("/grpc.testing.TestService/EmptyCall").WaitForReady != nil {
|
||||
break
|
||||
}
|
||||
time.Sleep(time.Millisecond)
|
||||
}
|
||||
cancel()
|
||||
|
||||
testCases := []struct {
|
||||
code codes.Code
|
||||
count int
|
||||
}{
|
||||
{codes.OK, 0}, // tokens = 10
|
||||
{codes.OK, 3}, // tokens = 8.5 (10 - 2 failures + 0.5 success)
|
||||
{codes.OK, 6}, // tokens = 6
|
||||
{codes.Unavailable, 8}, // tokens = 5 -- first attempt is retried; second aborted.
|
||||
{codes.Unavailable, 9}, // tokens = 4
|
||||
{codes.OK, 10}, // tokens = 4.5
|
||||
{codes.OK, 11}, // tokens = 5
|
||||
{codes.OK, 12}, // tokens = 5.5
|
||||
{codes.OK, 13}, // tokens = 6
|
||||
{codes.OK, 14}, // tokens = 6.5
|
||||
{codes.OK, 16}, // tokens = 5.5
|
||||
{codes.Unavailable, 17}, // tokens = 4.5
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
_, err := ss.client.EmptyCall(ctx, &testpb.Empty{})
|
||||
cancel()
|
||||
if status.Code(err) != tc.code {
|
||||
t.Errorf("EmptyCall(_, _) = _, %v; want _, <Code() = %v>", err, tc.code)
|
||||
}
|
||||
if i != tc.count {
|
||||
t.Errorf("i = %v; want %v", i, tc.count)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestRetryStreaming(t *testing.T) {
|
||||
defer enableRetry()()
|
||||
req := func(b byte) *testpb.StreamingOutputCallRequest {
|
||||
return &testpb.StreamingOutputCallRequest{Payload: &testpb.Payload{Body: []byte{b}}}
|
||||
}
|
||||
res := func(b byte) *testpb.StreamingOutputCallResponse {
|
||||
return &testpb.StreamingOutputCallResponse{Payload: &testpb.Payload{Body: []byte{b}}}
|
||||
}
|
||||
|
||||
largePayload, _ := newPayload(testpb.PayloadType_COMPRESSABLE, 500)
|
||||
|
||||
type serverOp func(stream testpb.TestService_FullDuplexCallServer) error
|
||||
type clientOp func(stream testpb.TestService_FullDuplexCallClient) error
|
||||
|
||||
// Server Operations
|
||||
sAttempts := func(n int) serverOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallServer) error {
|
||||
const key = "grpc-previous-rpc-attempts"
|
||||
md, ok := metadata.FromIncomingContext(stream.Context())
|
||||
if !ok {
|
||||
return status.Errorf(codes.Internal, "server: no header metadata received")
|
||||
}
|
||||
if got := md[key]; len(got) != 1 || got[0] != strconv.Itoa(n) {
|
||||
return status.Errorf(codes.Internal, "server: metadata = %v; want <contains %q: %q>", md, key, n)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
sReq := func(b byte) serverOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallServer) error {
|
||||
want := req(b)
|
||||
if got, err := stream.Recv(); err != nil || !proto.Equal(got, want) {
|
||||
return status.Errorf(codes.Internal, "server: Recv() = %v, %v; want %v, <nil>", got, err, want)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
sReqPayload := func(p *testpb.Payload) serverOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallServer) error {
|
||||
want := &testpb.StreamingOutputCallRequest{Payload: p}
|
||||
if got, err := stream.Recv(); err != nil || !proto.Equal(got, want) {
|
||||
return status.Errorf(codes.Internal, "server: Recv() = %v, %v; want %v, <nil>", got, err, want)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
sRes := func(b byte) serverOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallServer) error {
|
||||
msg := res(b)
|
||||
if err := stream.Send(msg); err != nil {
|
||||
return status.Errorf(codes.Internal, "server: Send(%v) = %v; want <nil>", msg, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
sErr := func(c codes.Code) serverOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallServer) error {
|
||||
return status.New(c, "").Err()
|
||||
}
|
||||
}
|
||||
sCloseSend := func() serverOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallServer) error {
|
||||
if msg, err := stream.Recv(); msg != nil || err != io.EOF {
|
||||
return status.Errorf(codes.Internal, "server: Recv() = %v, %v; want <nil>, io.EOF", msg, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
sPushback := func(s string) serverOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallServer) error {
|
||||
stream.SetTrailer(metadata.MD{"grpc-retry-pushback-ms": []string{s}})
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// Client Operations
|
||||
cReq := func(b byte) clientOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallClient) error {
|
||||
msg := req(b)
|
||||
if err := stream.Send(msg); err != nil {
|
||||
return fmt.Errorf("client: Send(%v) = %v; want <nil>", msg, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
cReqPayload := func(p *testpb.Payload) clientOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallClient) error {
|
||||
msg := &testpb.StreamingOutputCallRequest{Payload: p}
|
||||
if err := stream.Send(msg); err != nil {
|
||||
return fmt.Errorf("client: Send(%v) = %v; want <nil>", msg, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
cRes := func(b byte) clientOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallClient) error {
|
||||
want := res(b)
|
||||
if got, err := stream.Recv(); err != nil || !proto.Equal(got, want) {
|
||||
return fmt.Errorf("client: Recv() = %v, %v; want %v, <nil>", got, err, want)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
cErr := func(c codes.Code) clientOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallClient) error {
|
||||
want := status.New(c, "").Err()
|
||||
if c == codes.OK {
|
||||
want = io.EOF
|
||||
}
|
||||
res, err := stream.Recv()
|
||||
if res != nil ||
|
||||
((err == nil) != (want == nil)) ||
|
||||
(want != nil && !reflect.DeepEqual(err, want)) {
|
||||
return fmt.Errorf("client: Recv() = %v, %v; want <nil>, %v", res, err, want)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
cCloseSend := func() clientOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallClient) error {
|
||||
if err := stream.CloseSend(); err != nil {
|
||||
return fmt.Errorf("client: CloseSend() = %v; want <nil>", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
var curTime time.Time
|
||||
cGetTime := func() clientOp {
|
||||
return func(_ testpb.TestService_FullDuplexCallClient) error {
|
||||
curTime = time.Now()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
cCheckElapsed := func(d time.Duration) clientOp {
|
||||
return func(_ testpb.TestService_FullDuplexCallClient) error {
|
||||
if elapsed := time.Since(curTime); elapsed < d {
|
||||
return fmt.Errorf("Elapsed time: %v; want >= %v", elapsed, d)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
cHdr := func() clientOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallClient) error {
|
||||
_, err := stream.Header()
|
||||
return err
|
||||
}
|
||||
}
|
||||
cCtx := func() clientOp {
|
||||
return func(stream testpb.TestService_FullDuplexCallClient) error {
|
||||
stream.Context()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
testCases := []struct {
|
||||
desc string
|
||||
serverOps []serverOp
|
||||
clientOps []clientOp
|
||||
}{{
|
||||
desc: "Non-retryable error code",
|
||||
serverOps: []serverOp{sReq(1), sErr(codes.Internal)},
|
||||
clientOps: []clientOp{cReq(1), cErr(codes.Internal)},
|
||||
}, {
|
||||
desc: "One retry necessary",
|
||||
serverOps: []serverOp{sReq(1), sErr(codes.Unavailable), sReq(1), sAttempts(1), sRes(1)},
|
||||
clientOps: []clientOp{cReq(1), cRes(1), cErr(codes.OK)},
|
||||
}, {
|
||||
desc: "Exceed max attempts (4); check attempts header on server",
|
||||
serverOps: []serverOp{
|
||||
sReq(1), sErr(codes.Unavailable),
|
||||
sReq(1), sAttempts(1), sErr(codes.Unavailable),
|
||||
sAttempts(2), sReq(1), sErr(codes.Unavailable),
|
||||
sAttempts(3), sReq(1), sErr(codes.Unavailable),
|
||||
},
|
||||
clientOps: []clientOp{cReq(1), cErr(codes.Unavailable)},
|
||||
}, {
|
||||
desc: "Multiple requests",
|
||||
serverOps: []serverOp{
|
||||
sReq(1), sReq(2), sErr(codes.Unavailable),
|
||||
sReq(1), sReq(2), sRes(5),
|
||||
},
|
||||
clientOps: []clientOp{cReq(1), cReq(2), cRes(5), cErr(codes.OK)},
|
||||
}, {
|
||||
desc: "Multiple successive requests",
|
||||
serverOps: []serverOp{
|
||||
sReq(1), sErr(codes.Unavailable),
|
||||
sReq(1), sReq(2), sErr(codes.Unavailable),
|
||||
sReq(1), sReq(2), sReq(3), sRes(5),
|
||||
},
|
||||
clientOps: []clientOp{cReq(1), cReq(2), cReq(3), cRes(5), cErr(codes.OK)},
|
||||
}, {
|
||||
desc: "No retry after receiving",
|
||||
serverOps: []serverOp{
|
||||
sReq(1), sErr(codes.Unavailable),
|
||||
sReq(1), sRes(3), sErr(codes.Unavailable),
|
||||
},
|
||||
clientOps: []clientOp{cReq(1), cRes(3), cErr(codes.Unavailable)},
|
||||
}, {
|
||||
desc: "No retry after header",
|
||||
serverOps: []serverOp{sReq(1), sErr(codes.Unavailable)},
|
||||
clientOps: []clientOp{cReq(1), cHdr(), cErr(codes.Unavailable)},
|
||||
}, {
|
||||
desc: "No retry after context",
|
||||
serverOps: []serverOp{sReq(1), sErr(codes.Unavailable)},
|
||||
clientOps: []clientOp{cReq(1), cCtx(), cErr(codes.Unavailable)},
|
||||
}, {
|
||||
desc: "Replaying close send",
|
||||
serverOps: []serverOp{
|
||||
sReq(1), sReq(2), sCloseSend(), sErr(codes.Unavailable),
|
||||
sReq(1), sReq(2), sCloseSend(), sRes(1), sRes(3), sRes(5),
|
||||
},
|
||||
clientOps: []clientOp{cReq(1), cReq(2), cCloseSend(), cRes(1), cRes(3), cRes(5), cErr(codes.OK)},
|
||||
}, {
|
||||
desc: "Negative server pushback - no retry",
|
||||
serverOps: []serverOp{sReq(1), sPushback("-1"), sErr(codes.Unavailable)},
|
||||
clientOps: []clientOp{cReq(1), cErr(codes.Unavailable)},
|
||||
}, {
|
||||
desc: "Non-numeric server pushback - no retry",
|
||||
serverOps: []serverOp{sReq(1), sPushback("xxx"), sErr(codes.Unavailable)},
|
||||
clientOps: []clientOp{cReq(1), cErr(codes.Unavailable)},
|
||||
}, {
|
||||
desc: "Multiple server pushback values - no retry",
|
||||
serverOps: []serverOp{sReq(1), sPushback("100"), sPushback("10"), sErr(codes.Unavailable)},
|
||||
clientOps: []clientOp{cReq(1), cErr(codes.Unavailable)},
|
||||
}, {
|
||||
desc: "1s server pushback - delayed retry",
|
||||
serverOps: []serverOp{sReq(1), sPushback("1000"), sErr(codes.Unavailable), sReq(1), sRes(2)},
|
||||
clientOps: []clientOp{cGetTime(), cReq(1), cRes(2), cCheckElapsed(time.Second), cErr(codes.OK)},
|
||||
}, {
|
||||
desc: "Overflowing buffer - no retry",
|
||||
serverOps: []serverOp{sReqPayload(largePayload), sErr(codes.Unavailable)},
|
||||
clientOps: []clientOp{cReqPayload(largePayload), cErr(codes.Unavailable)},
|
||||
}}
|
||||
|
||||
var serverOpIter int
|
||||
var serverOps []serverOp
|
||||
ss := &stubServer{
|
||||
fullDuplexCall: func(stream testpb.TestService_FullDuplexCallServer) error {
|
||||
for serverOpIter < len(serverOps) {
|
||||
op := serverOps[serverOpIter]
|
||||
serverOpIter++
|
||||
if err := op(stream); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
},
|
||||
}
|
||||
if err := ss.Start([]grpc.ServerOption{}, grpc.WithDefaultCallOptions(grpc.MaxRetryRPCBufferSize(200))); err != nil {
|
||||
t.Fatalf("Error starting endpoint server: %v", err)
|
||||
}
|
||||
defer ss.Stop()
|
||||
ss.r.NewServiceConfig(`{
|
||||
"methodConfig": [{
|
||||
"name": [{"service": "grpc.testing.TestService"}],
|
||||
"waitForReady": true,
|
||||
"retryPolicy": {
|
||||
"MaxAttempts": 4,
|
||||
"InitialBackoff": ".01s",
|
||||
"MaxBackoff": ".01s",
|
||||
"BackoffMultiplier": 1.0,
|
||||
"RetryableStatusCodes": [ "UNAVAILABLE" ]
|
||||
}
|
||||
}]}`)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
||||
for {
|
||||
if ctx.Err() != nil {
|
||||
t.Fatalf("Timed out waiting for service config update")
|
||||
}
|
||||
if ss.cc.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall").WaitForReady != nil {
|
||||
break
|
||||
}
|
||||
time.Sleep(time.Millisecond)
|
||||
}
|
||||
cancel()
|
||||
|
||||
for _, tc := range testCases {
|
||||
func() {
|
||||
serverOpIter = 0
|
||||
serverOps = tc.serverOps
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
stream, err := ss.client.FullDuplexCall(ctx)
|
||||
if err != nil {
|
||||
t.Fatalf("%v: Error while creating stream: %v", tc.desc, err)
|
||||
}
|
||||
for _, op := range tc.clientOps {
|
||||
if err := op(stream); err != nil {
|
||||
t.Errorf("%v: %v", tc.desc, err)
|
||||
break
|
||||
}
|
||||
}
|
||||
if serverOpIter != len(serverOps) {
|
||||
t.Errorf("%v: serverOpIter = %v; want %v", tc.desc, serverOpIter, len(serverOps))
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
34
vendor/google.golang.org/grpc/test/tools/tools.go
generated
vendored
Normal file
34
vendor/google.golang.org/grpc/test/tools/tools.go
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
// +build tools
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
// This package exists to cause `go mod` and `go get` to believe these tools
|
||||
// are dependencies, even though they are not runtime dependencies of any grpc
|
||||
// package. This means they will appear in our `go.mod` file, but will not be
|
||||
// a part of the build.
|
||||
|
||||
package tools
|
||||
|
||||
import (
|
||||
_ "github.com/client9/misspell/cmd/misspell"
|
||||
_ "github.com/golang/lint/golint"
|
||||
_ "github.com/golang/protobuf/protoc-gen-go"
|
||||
_ "golang.org/x/tools/cmd/goimports"
|
||||
_ "honnef.co/go/tools/cmd/staticcheck"
|
||||
)
|
Reference in New Issue
Block a user