...
1
18
19 package xds
20
21 import (
22 "context"
23 "errors"
24 "fmt"
25 "testing"
26 "time"
27
28 "google.golang.org/grpc"
29 "google.golang.org/grpc/credentials/insecure"
30 "google.golang.org/grpc/internal"
31 "google.golang.org/grpc/internal/grpctest"
32 "google.golang.org/grpc/internal/stubserver"
33 "google.golang.org/grpc/internal/testutils"
34 testgrpc "google.golang.org/grpc/interop/grpc_testing"
35 testpb "google.golang.org/grpc/interop/grpc_testing"
36 "google.golang.org/grpc/metadata"
37 "google.golang.org/grpc/resolver"
38 "google.golang.org/grpc/resolver/manual"
39 "google.golang.org/grpc/serviceconfig"
40 )
41
42 var defaultTestTimeout = 5 * time.Second
43
44 type s struct {
45 grpctest.Tester
46 }
47
48 func Test(t *testing.T) {
49 grpctest.RunSubTests(t, s{})
50 }
51
52
53
54
55
56 func (s) TestCustomLB(t *testing.T) {
57 errCh := testutils.NewChannel()
58
59
60 backend := &stubserver.StubServer{
61 UnaryCallF: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
62 md, ok := metadata.FromIncomingContext(ctx)
63 if !ok {
64 errCh.Send(errors.New("failed to receive metadata"))
65 return &testpb.SimpleResponse{}, nil
66 }
67 rpcBMD := md.Get("rpc-behavior")
68 if len(rpcBMD) != 1 {
69 errCh.Send(fmt.Errorf("received %d values for metadata key \"rpc-behavior\", want 1", len(rpcBMD)))
70 return &testpb.SimpleResponse{}, nil
71 }
72 wantVal := "error-code-0"
73 if rpcBMD[0] != wantVal {
74 errCh.Send(fmt.Errorf("metadata val for key \"rpc-behavior\": got val %v, want val %v", rpcBMD[0], wantVal))
75 return &testpb.SimpleResponse{}, nil
76 }
77
78 errCh.Send(nil)
79 return &testpb.SimpleResponse{}, nil
80 },
81 }
82 if err := backend.StartServer(); err != nil {
83 t.Fatalf("Failed to start backend: %v", err)
84 }
85 t.Logf("Started good TestService backend at: %q", backend.Address)
86 defer backend.Stop()
87
88 lbCfgJSON := `{
89 "loadBalancingConfig": [
90 {
91 "test.RpcBehaviorLoadBalancer": {
92 "rpcBehavior": "error-code-0"
93 }
94 }
95 ]
96 }`
97
98 sc := internal.ParseServiceConfig.(func(string) *serviceconfig.ParseResult)(lbCfgJSON)
99 mr := manual.NewBuilderWithScheme("customlb-e2e")
100 defer mr.Close()
101 mr.InitialState(resolver.State{
102 Addresses: []resolver.Address{
103 {Addr: backend.Address},
104 },
105 ServiceConfig: sc,
106 })
107
108 cc, err := grpc.NewClient(mr.Scheme()+":///", grpc.WithResolvers(mr), grpc.WithTransportCredentials(insecure.NewCredentials()))
109 if err != nil {
110 t.Fatalf("grpc.NewClient() failed: %v", err)
111 }
112 defer cc.Close()
113 ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
114 defer cancel()
115 testServiceClient := testgrpc.NewTestServiceClient(cc)
116
117
118
119
120
121 if _, err := testServiceClient.UnaryCall(ctx, &testpb.SimpleRequest{}); err != nil {
122 t.Fatalf("EmptyCall() failed: %v", err)
123 }
124
125 val, err := errCh.Receive(ctx)
126 if err != nil {
127 t.Fatalf("error receiving from errCh: %v", err)
128 }
129
130
131
132 if err, ok := val.(error); ok {
133 t.Fatalf("error in backend verifications on metadata received: %v", err)
134 }
135 }
136
View as plain text