github.com/defanghe/fabric@v2.1.1+incompatible/internal/pkg/comm/serverstatshandler_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package comm_test 8 9 import ( 10 "context" 11 "net" 12 "testing" 13 "time" 14 15 "github.com/hyperledger/fabric/common/metrics" 16 "github.com/hyperledger/fabric/common/metrics/metricsfakes" 17 "github.com/hyperledger/fabric/internal/pkg/comm" 18 "github.com/hyperledger/fabric/internal/pkg/comm/testpb" 19 . "github.com/onsi/gomega" 20 "google.golang.org/grpc" 21 "google.golang.org/grpc/stats" 22 ) 23 24 func TestConnectionCounters(t *testing.T) { 25 t.Parallel() 26 gt := NewGomegaWithT(t) 27 28 openConn := &metricsfakes.Counter{} 29 closedConn := &metricsfakes.Counter{} 30 sh := &comm.ServerStatsHandler{ 31 OpenConnCounter: openConn, 32 ClosedConnCounter: closedConn, 33 } 34 35 for i := 1; i <= 10; i++ { 36 sh.HandleConn(context.Background(), &stats.ConnBegin{}) 37 gt.Expect(openConn.AddCallCount()).To(Equal(i)) 38 } 39 40 for i := 1; i <= 5; i++ { 41 sh.HandleConn(context.Background(), &stats.ConnEnd{}) 42 gt.Expect(closedConn.AddCallCount()).To(Equal(i)) 43 } 44 } 45 46 func TestConnMetricsGRPCServer(t *testing.T) { 47 t.Parallel() 48 gt := NewGomegaWithT(t) 49 50 openConn := &metricsfakes.Counter{} 51 closedConn := &metricsfakes.Counter{} 52 fakeProvider := &metricsfakes.Provider{} 53 fakeProvider.NewCounterStub = func(o metrics.CounterOpts) metrics.Counter { 54 switch o.Name { 55 case "conn_opened": 56 return openConn 57 case "conn_closed": 58 return closedConn 59 default: 60 panic("unknown counter") 61 } 62 } 63 64 listener, err := net.Listen("tcp", "localhost:0") 65 gt.Expect(err).NotTo(HaveOccurred()) 66 srv, err := comm.NewGRPCServerFromListener( 67 listener, 68 comm.ServerConfig{ 69 SecOpts: comm.SecureOptions{UseTLS: false}, 70 ServerStatsHandler: comm.NewServerStatsHandler(fakeProvider), 71 }, 72 ) 73 gt.Expect(err).NotTo(HaveOccurred()) 74 75 // register the GRPC test server 76 testpb.RegisterEmptyServiceServer(srv.Server(), &emptyServiceServer{}) 77 78 // start the server 79 go srv.Start() 80 defer srv.Stop() 81 82 // test grpc connection counts 83 ctx, cancel := context.WithTimeout(context.Background(), testTimeout) 84 defer cancel() 85 86 gt.Expect(openConn.AddCallCount()).To(Equal(0)) 87 gt.Expect(closedConn.AddCallCount()).To(Equal(0)) 88 89 //create GRPC client conn 90 var clientConns []*grpc.ClientConn 91 for i := 1; i <= 3; i++ { 92 clientConn, err := grpc.DialContext(ctx, listener.Addr().String(), grpc.WithInsecure()) 93 gt.Expect(err).NotTo(HaveOccurred()) 94 clientConns = append(clientConns, clientConn) 95 96 //invoke service 97 client := testpb.NewEmptyServiceClient(clientConn) 98 _, err = client.EmptyCall(context.Background(), &testpb.Empty{}) 99 gt.Expect(err).NotTo(HaveOccurred()) 100 gt.Expect(openConn.AddCallCount()).To(Equal(i)) 101 } 102 103 for i, conn := range clientConns { 104 gt.Expect(closedConn.AddCallCount()).Should(Equal(i)) 105 conn.Close() 106 gt.Eventually(closedConn.AddCallCount, time.Second).Should(Equal(i + 1)) 107 } 108 }