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  }