gitee.com/zhaochuninhefei/gmgo@v0.0.31-0.20240209061119-069254a02979/grpc/server_test.go (about) 1 /* 2 * 3 * Copyright 2016 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 package grpc 20 21 import ( 22 "context" 23 "errors" 24 "net" 25 "reflect" 26 "strconv" 27 "strings" 28 "testing" 29 "time" 30 31 "gitee.com/zhaochuninhefei/gmgo/grpc/internal/transport" 32 ) 33 34 type emptyServiceServer interface{} 35 36 type testServer struct{} 37 38 func (s) TestStopBeforeServe(t *testing.T) { 39 lis, err := net.Listen("tcp", "localhost:0") 40 if err != nil { 41 t.Fatalf("failed to create listener: %v", err) 42 } 43 44 server := NewServer() 45 server.Stop() 46 err = server.Serve(lis) 47 if !errors.Is(err, ErrServerStopped) { 48 t.Fatalf("server.Serve() error = %v, want %v", err, ErrServerStopped) 49 } 50 51 // server.Serve is responsible for closing the listener, even if the 52 // server was already stopped. 53 err = lis.Close() 54 if got, want := errorDesc(err), "use of closed"; !strings.Contains(got, want) { 55 t.Errorf("Close() error = %q, want %q", got, want) 56 } 57 } 58 59 func (s) TestGracefulStop(t *testing.T) { 60 61 lis, err := net.Listen("tcp", "localhost:0") 62 if err != nil { 63 t.Fatalf("failed to create listener: %v", err) 64 } 65 66 server := NewServer() 67 go func() { 68 // make sure Serve() is called 69 time.Sleep(time.Millisecond * 500) 70 server.GracefulStop() 71 }() 72 73 err = server.Serve(lis) 74 if err != nil { 75 t.Fatalf("Serve() returned non-nil error on GracefulStop: %v", err) 76 } 77 } 78 79 func (s) TestGetServiceInfo(t *testing.T) { 80 testSd := ServiceDesc{ 81 ServiceName: "grpc.testing.EmptyService", 82 HandlerType: (*emptyServiceServer)(nil), 83 Methods: []MethodDesc{ 84 { 85 MethodName: "EmptyCall", 86 Handler: nil, 87 }, 88 }, 89 Streams: []StreamDesc{ 90 { 91 StreamName: "EmptyStream", 92 Handler: nil, 93 ServerStreams: false, 94 ClientStreams: true, 95 }, 96 }, 97 Metadata: []int{0, 2, 1, 3}, 98 } 99 100 server := NewServer() 101 server.RegisterService(&testSd, &testServer{}) 102 103 info := server.GetServiceInfo() 104 want := map[string]ServiceInfo{ 105 "grpc.testing.EmptyService": { 106 Methods: []MethodInfo{ 107 { 108 Name: "EmptyCall", 109 IsClientStream: false, 110 IsServerStream: false, 111 }, 112 { 113 Name: "EmptyStream", 114 IsClientStream: true, 115 IsServerStream: false, 116 }}, 117 Metadata: []int{0, 2, 1, 3}, 118 }, 119 } 120 121 if !reflect.DeepEqual(info, want) { 122 t.Errorf("GetServiceInfo() = %+v, want %+v", info, want) 123 } 124 } 125 126 func (s) TestStreamContext(t *testing.T) { 127 expectedStream := &transport.Stream{} 128 ctx := NewContextWithServerTransportStream(context.Background(), expectedStream) 129 s := ServerTransportStreamFromContext(ctx) 130 stream, ok := s.(*transport.Stream) 131 if !ok || expectedStream != stream { 132 t.Fatalf("GetStreamFromContext(%v) = %v, %t, want: %v, true", ctx, stream, ok, expectedStream) 133 } 134 } 135 136 func BenchmarkChainUnaryInterceptor(b *testing.B) { 137 for _, n := range []int{1, 3, 5, 10} { 138 n := n 139 b.Run(strconv.Itoa(n), func(b *testing.B) { 140 interceptors := make([]UnaryServerInterceptor, 0, n) 141 for i := 0; i < n; i++ { 142 interceptors = append(interceptors, func( 143 ctx context.Context, req interface{}, info *UnaryServerInfo, handler UnaryHandler, 144 ) (interface{}, error) { 145 return handler(ctx, req) 146 }) 147 } 148 149 s := NewServer(ChainUnaryInterceptor(interceptors...)) 150 b.ReportAllocs() 151 b.ResetTimer() 152 for i := 0; i < b.N; i++ { 153 if _, err := s.opts.unaryInt(context.Background(), nil, nil, 154 func(ctx context.Context, req interface{}) (interface{}, error) { 155 return nil, nil 156 }, 157 ); err != nil { 158 b.Fatal(err) 159 } 160 } 161 }) 162 } 163 } 164 165 func BenchmarkChainStreamInterceptor(b *testing.B) { 166 for _, n := range []int{1, 3, 5, 10} { 167 n := n 168 b.Run(strconv.Itoa(n), func(b *testing.B) { 169 interceptors := make([]StreamServerInterceptor, 0, n) 170 for i := 0; i < n; i++ { 171 interceptors = append(interceptors, func( 172 srv interface{}, ss ServerStream, info *StreamServerInfo, handler StreamHandler, 173 ) error { 174 return handler(srv, ss) 175 }) 176 } 177 178 s := NewServer(ChainStreamInterceptor(interceptors...)) 179 b.ReportAllocs() 180 b.ResetTimer() 181 for i := 0; i < b.N; i++ { 182 if err := s.opts.streamInt(nil, nil, nil, func(srv interface{}, stream ServerStream) error { 183 return nil 184 }); err != nil { 185 b.Fatal(err) 186 } 187 } 188 }) 189 } 190 }