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 }