github.com/lzy4123/fabric@v2.1.1+incompatible/core/handlers/auth/auth_test.go (about) 1 /* 2 Copyright IBM Corp, 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/assert" 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(nil, initialProposal) 27 for i := 0; i < iterations; i++ { 28 assert.Equal(t, uint32(i), filters[i].(*mockAuthFilter).sequence, 29 "Expected filters to be invoked in the provided sequence") 30 } 31 32 assert.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(nil, initialProposal) 39 assert.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 }