github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/orderer/common/multichannel/ledger_resources_test.go (about) 1 /* 2 Copyright hechain. 2017 All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package multichannel 8 9 import ( 10 "testing" 11 12 "github.com/golang/protobuf/proto" 13 "github.com/hechain20/hechain/bccsp/sw" 14 "github.com/hechain20/hechain/common/channelconfig" 15 "github.com/hechain20/hechain/common/deliver/mock" 16 "github.com/hechain20/hechain/common/ledger/blockledger" 17 "github.com/hechain20/hechain/common/policies" 18 "github.com/hechain20/hechain/core/config/configtest" 19 "github.com/hechain20/hechain/internal/configtxgen/encoder" 20 "github.com/hechain20/hechain/internal/configtxgen/genesisconfig" 21 "github.com/hechain20/hechain/orderer/common/multichannel/mocks" 22 "github.com/hechain20/hechain/protoutil" 23 "github.com/hyperledger/fabric-protos-go/common" 24 "github.com/hyperledger/fabric-protos-go/orderer" 25 "github.com/pkg/errors" 26 "github.com/stretchr/testify/require" 27 ) 28 29 //go:generate counterfeiter -o mocks/policy.go --fake-name Policy . policy 30 31 type policy interface{ policies.Policy } 32 33 //go:generate counterfeiter -o mocks/policy_manager.go --fake-name PolicyManager . policyManager 34 35 type policyManager interface{ policies.Manager } 36 37 //go:generate counterfeiter -o mocks/read_writer.go --fake-name ReadWriter . readWriter 38 39 type readWriter interface{ blockledger.ReadWriter } 40 41 func TestChainSupportBlock(t *testing.T) { 42 ledger := &mocks.ReadWriter{} 43 ledger.HeightReturns(100) 44 iterator := &mock.BlockIterator{} 45 iterator.NextReturns(&common.Block{Header: &common.BlockHeader{Number: 99}}, common.Status_SUCCESS) 46 ledger.IteratorReturns(iterator, 99) 47 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 48 require.NoError(t, err) 49 cs := &ChainSupport{ 50 ledgerResources: &ledgerResources{ReadWriter: ledger}, 51 BCCSP: cryptoProvider, 52 } 53 54 require.Nil(t, cs.Block(100)) 55 require.Equal(t, uint64(99), cs.Block(99).Header.Number) 56 } 57 58 type mutableResourcesMock struct { 59 *mocks.Resources 60 newConsensusMetadataVal []byte 61 } 62 63 func (*mutableResourcesMock) Update(*channelconfig.Bundle) { 64 panic("implement me") 65 } 66 67 func (mrm *mutableResourcesMock) CreateBundle(channelID string, c *common.Config) (channelconfig.Resources, error) { 68 mockOrderer := &mocks.OrdererConfig{} 69 mockOrderer.ConsensusMetadataReturns(mrm.newConsensusMetadataVal) 70 mockResources := &mocks.Resources{} 71 mockResources.OrdererConfigReturns(mockOrderer, true) 72 73 return mockResources, nil 74 } 75 76 func TestLedgerResources_VerifyBlockSignature(t *testing.T) { 77 mockResources := &mocks.Resources{} 78 mockValidator := &mocks.ConfigTXValidator{} 79 mockValidator.ChannelIDReturns("mychannel") 80 mockResources.ConfigtxValidatorReturns(mockValidator) 81 82 mockPolicy := &mocks.Policy{} 83 mockPolicyManager := &mocks.PolicyManager{} 84 mockResources.PolicyManagerReturns(mockPolicyManager) 85 86 ms := &mutableResourcesMock{ 87 Resources: mockResources, 88 } 89 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 90 require.NoError(t, err) 91 cs := &ChainSupport{ 92 ledgerResources: &ledgerResources{ 93 configResources: &configResources{ 94 mutableResources: ms, 95 bccsp: cryptoProvider, 96 }, 97 }, 98 BCCSP: cryptoProvider, 99 } 100 101 // Scenario I: Policy manager isn't initialized 102 // and thus policy cannot be found 103 mockPolicyManager.GetPolicyReturns(nil, false) 104 err = cs.VerifyBlockSignature([]*protoutil.SignedData{}, nil) 105 require.EqualError(t, err, "policy /Channel/Orderer/BlockValidation wasn't found") 106 107 mockPolicyManager.GetPolicyReturns(mockPolicy, true) 108 // Scenario II: Policy manager finds policy, but it evaluates 109 // to error. 110 mockPolicy.EvaluateSignedDataReturns(errors.New("invalid signature")) 111 err = cs.VerifyBlockSignature([]*protoutil.SignedData{}, nil) 112 require.EqualError(t, err, "block verification failed: invalid signature") 113 114 // Scenario III: Policy manager finds policy, and it evaluates to success 115 mockPolicy.EvaluateSignedDataReturns(nil) 116 require.NoError(t, cs.VerifyBlockSignature([]*protoutil.SignedData{}, nil)) 117 118 // Scenario IV: A bad config envelope is passed 119 err = cs.VerifyBlockSignature([]*protoutil.SignedData{}, &common.ConfigEnvelope{}) 120 require.EqualError(t, err, "channelconfig Config cannot be nil") 121 122 // Scenario V: A valid config envelope is passed 123 require.NoError(t, cs.VerifyBlockSignature([]*protoutil.SignedData{}, testConfigEnvelope(t))) 124 } 125 126 func testConfigEnvelope(t *testing.T) *common.ConfigEnvelope { 127 conf := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile, configtest.GetDevConfigDir()) 128 group, err := encoder.NewChannelGroup(conf) 129 require.NoError(t, err) 130 group.Groups["Orderer"].Values["ConsensusType"].Value, err = proto.Marshal(&orderer.ConsensusType{ 131 Metadata: []byte("new consensus metadata"), 132 }) 133 require.NoError(t, err) 134 require.NotNil(t, group) 135 return &common.ConfigEnvelope{ 136 Config: &common.Config{ 137 ChannelGroup: group, 138 }, 139 } 140 }