github.com/sykesm/fabric@v1.1.0-preview.0.20200129034918-2aa12b1a0181/core/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/core/comm"
    18  	"github.com/hyperledger/fabric/core/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  }