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  }