github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/handlers/auth/auth_test.go (about)

     1  /*
     2  Copyright hechain, SecureKey Technologies Inc. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package auth
     8  
     9  import (
    10  	"context"
    11  	"encoding/binary"
    12  	"testing"
    13  
    14  	"github.com/hyperledger/fabric-protos-go/peer"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestChainFilters(t *testing.T) {
    19  	iterations := 15
    20  	filters := createNFilters(iterations)
    21  	endorser := &mockEndorserServer{}
    22  	initialProposal := &peer.SignedProposal{ProposalBytes: make([]byte, 4)}
    23  	binary.BigEndian.PutUint32(initialProposal.ProposalBytes, 0)
    24  
    25  	firstFilter := ChainFilters(endorser, filters...)
    26  	firstFilter.ProcessProposal(context.Background(), initialProposal)
    27  	for i := 0; i < iterations; i++ {
    28  		require.Equal(t, uint32(i), filters[i].(*mockAuthFilter).sequence,
    29  			"Expected filters to be invoked in the provided sequence")
    30  	}
    31  
    32  	require.Equal(t, uint32(iterations), endorser.sequence,
    33  		"Expected endorser to be invoked after filters")
    34  
    35  	// Test with no filters
    36  	binary.BigEndian.PutUint32(initialProposal.ProposalBytes, 0)
    37  	firstFilter = ChainFilters(endorser)
    38  	firstFilter.ProcessProposal(context.Background(), initialProposal)
    39  	require.Equal(t, uint32(0), endorser.sequence,
    40  		"Expected endorser to be invoked first")
    41  }
    42  
    43  func createNFilters(n int) []Filter {
    44  	filters := make([]Filter, n)
    45  	for i := 0; i < n; i++ {
    46  		filters[i] = &mockAuthFilter{}
    47  	}
    48  	return filters
    49  }
    50  
    51  type mockEndorserServer struct {
    52  	sequence uint32
    53  }
    54  
    55  func (es *mockEndorserServer) ProcessProposal(ctx context.Context, prop *peer.SignedProposal) (*peer.ProposalResponse, error) {
    56  	es.sequence = binary.BigEndian.Uint32(prop.ProposalBytes)
    57  	binary.BigEndian.PutUint32(prop.ProposalBytes, es.sequence+1)
    58  	return nil, nil
    59  }
    60  
    61  type mockAuthFilter struct {
    62  	sequence uint32
    63  	next     peer.EndorserServer
    64  }
    65  
    66  func (f *mockAuthFilter) ProcessProposal(ctx context.Context, prop *peer.SignedProposal) (*peer.ProposalResponse, error) {
    67  	f.sequence = binary.BigEndian.Uint32(prop.ProposalBytes)
    68  	binary.BigEndian.PutUint32(prop.ProposalBytes, f.sequence+1)
    69  	return f.next.ProcessProposal(ctx, prop)
    70  }
    71  
    72  func (f *mockAuthFilter) Init(next peer.EndorserServer) {
    73  	f.next = next
    74  }