github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/internal/peer/node/grpc_limiters_test.go (about)

     1  /*
     2  Copyright Hitachi America, Ltd.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package node
     8  
     9  import (
    10  	"context"
    11  	"fmt"
    12  	"testing"
    13  
    14  	"github.com/stretchr/testify/require"
    15  	"google.golang.org/grpc"
    16  
    17  	"github.com/hechain20/hechain/core/peer"
    18  )
    19  
    20  func TestInitGrpcSemaphores(t *testing.T) {
    21  	config := peer.Config{
    22  		LimitsConcurrencyEndorserService: 5,
    23  		LimitsConcurrencyDeliverService:  5,
    24  		LimitsConcurrencyGatewayService:  5,
    25  	}
    26  	semaphores := initGrpcSemaphores(&config)
    27  	require.Equal(t, 3, len(semaphores))
    28  }
    29  
    30  func TestInitGrpcNoSemaphores(t *testing.T) {
    31  	config := peer.Config{
    32  		LimitsConcurrencyEndorserService: 0,
    33  		LimitsConcurrencyDeliverService:  0,
    34  		LimitsConcurrencyGatewayService:  0,
    35  	}
    36  	semaphores := initGrpcSemaphores(&config)
    37  	require.Equal(t, 0, len(semaphores))
    38  }
    39  
    40  func TestInitGrpcSemaphoresPanic(t *testing.T) {
    41  	config := peer.Config{
    42  		LimitsConcurrencyEndorserService: -1,
    43  	}
    44  	require.PanicsWithValue(t, "permits must be greater than 0", func() { initGrpcSemaphores(&config) })
    45  }
    46  
    47  func TestUnaryGrpcLimiterExceedLimit(t *testing.T) {
    48  	limit := 10
    49  	fullMethod := "/protos.Endorser/ProcessProposal"
    50  	semaphores := initGrpcSemaphores(&peer.Config{LimitsConcurrencyEndorserService: limit})
    51  	// acquire all permits so that semaphore buffer is full, expect error when calling interceptor
    52  	for i := 0; i < limit; i++ {
    53  		semaphores["/protos.Endorser"].TryAcquire()
    54  	}
    55  	interceptor := unaryGrpcLimiter(semaphores)
    56  	_, err := interceptor(context.Background(), nil, &grpc.UnaryServerInfo{FullMethod: fullMethod}, nil)
    57  	require.EqualError(t, err, fmt.Sprintf("too many requests for %s, exceeding concurrency limit (%d)", getServiceName(fullMethod), limit))
    58  }
    59  
    60  func TestStreamGrpcLimiterExceedLimit(t *testing.T) {
    61  	limit := 5
    62  	fullMethods := []string{"/protos.Deliver/Deliver", "/protos.Deliver/DeliverFiltered", "/protos.Deliver/DeliverWithPrivateData"}
    63  	semaphores := initGrpcSemaphores(&peer.Config{LimitsConcurrencyDeliverService: limit})
    64  	// acquire all permits so that semaphore buffer is full, expect error when calling interceptor
    65  	for i := 0; i < limit; i++ {
    66  		semaphores["/protos.Deliver"].TryAcquire()
    67  	}
    68  	interceptor := streamGrpcLimiter(semaphores)
    69  	for _, method := range fullMethods {
    70  		err := interceptor(nil, nil, &grpc.StreamServerInfo{FullMethod: method}, nil)
    71  		require.EqualError(t, err, fmt.Sprintf("too many requests for %s, exceeding concurrency limit (%d)", getServiceName(method), limit))
    72  	}
    73  }
    74  
    75  func TestGetServiceName(t *testing.T) {
    76  	require.Equal(t, "/protos.Endorser", getServiceName("/protos.Endorser/ProcessProposal"))
    77  	require.Equal(t, "/protos.Deliver", getServiceName("/protos.Deliver/Deliver"))
    78  	require.Equal(t, "/protos.Deliver", getServiceName("/protos.Deliver/DeliverFiltered"))
    79  	require.Equal(t, "/protos.Deliver", getServiceName("/protos.Deliver/DeliverWithPrivateData"))
    80  	require.Equal(t, "/gateway.Gateway", getServiceName("/gateway.Gateway/Evaluate"))
    81  	require.Equal(t, "/gateway.Gateway", getServiceName("/gateway.Gateway/Endorse"))
    82  	require.Equal(t, "/gateway.Gateway", getServiceName("/gateway.Gateway/Submit"))
    83  	require.Equal(t, "/gateway.Gateway", getServiceName("/gateway.Gateway/CommitStatus"))
    84  	require.Equal(t, "/gateway.Gateway", getServiceName("/gateway.Gateway/ChaincodeEvents"))
    85  }