github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/committer/committer_test.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package committer
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/hechain20/hechain/common/configtx/test"
    13  	"github.com/hechain20/hechain/common/ledger"
    14  	"github.com/hechain20/hechain/common/ledger/testutil"
    15  	ledger2 "github.com/hechain20/hechain/core/ledger"
    16  	"github.com/hyperledger/fabric-protos-go/common"
    17  	"github.com/hyperledger/fabric-protos-go/peer"
    18  	"github.com/stretchr/testify/mock"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  type mockLedger struct {
    23  	height       uint64
    24  	currentHash  []byte
    25  	previousHash []byte
    26  	mock.Mock
    27  }
    28  
    29  func (m *mockLedger) GetConfigHistoryRetriever() (ledger2.ConfigHistoryRetriever, error) {
    30  	args := m.Called()
    31  	return args.Get(0).(ledger2.ConfigHistoryRetriever), args.Error(1)
    32  }
    33  
    34  func (m *mockLedger) GetBlockchainInfo() (*common.BlockchainInfo, error) {
    35  	info := &common.BlockchainInfo{
    36  		Height:            m.height,
    37  		CurrentBlockHash:  m.currentHash,
    38  		PreviousBlockHash: m.previousHash,
    39  	}
    40  	return info, nil
    41  }
    42  
    43  func (m *mockLedger) DoesPvtDataInfoExist(blkNum uint64) (bool, error) {
    44  	args := m.Called()
    45  	return args.Get(0).(bool), args.Error(1)
    46  }
    47  
    48  func (m *mockLedger) GetBlockByNumber(blockNumber uint64) (*common.Block, error) {
    49  	args := m.Called(blockNumber)
    50  	return args.Get(0).(*common.Block), args.Error(1)
    51  }
    52  
    53  func (m *mockLedger) GetBlocksIterator(startBlockNumber uint64) (ledger.ResultsIterator, error) {
    54  	args := m.Called(startBlockNumber)
    55  	return args.Get(0).(ledger.ResultsIterator), args.Error(1)
    56  }
    57  
    58  func (m *mockLedger) Close() {
    59  }
    60  
    61  // TxIDExists returns true if the specified txID is already present in one of the already committed blocks
    62  func (m *mockLedger) TxIDExists(txID string) (bool, error) {
    63  	args := m.Called(txID)
    64  	return args.Get(0).(bool), args.Error(1)
    65  }
    66  
    67  func (m *mockLedger) GetTransactionByID(txID string) (*peer.ProcessedTransaction, error) {
    68  	args := m.Called(txID)
    69  	return args.Get(0).(*peer.ProcessedTransaction), args.Error(1)
    70  }
    71  
    72  func (m *mockLedger) GetBlockByHash(blockHash []byte) (*common.Block, error) {
    73  	args := m.Called(blockHash)
    74  	return args.Get(0).(*common.Block), args.Error(1)
    75  }
    76  
    77  func (m *mockLedger) GetBlockByTxID(txID string) (*common.Block, error) {
    78  	args := m.Called(txID)
    79  	return args.Get(0).(*common.Block), args.Error(1)
    80  }
    81  
    82  func (m *mockLedger) GetTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error) {
    83  	args := m.Called(txID)
    84  	return args.Get(0).(peer.TxValidationCode), args.Error(1)
    85  }
    86  
    87  func (m *mockLedger) NewTxSimulator(txid string) (ledger2.TxSimulator, error) {
    88  	args := m.Called(txid)
    89  	return args.Get(0).(ledger2.TxSimulator), args.Error(1)
    90  }
    91  
    92  func (m *mockLedger) NewQueryExecutor() (ledger2.QueryExecutor, error) {
    93  	args := m.Called()
    94  	return args.Get(0).(ledger2.QueryExecutor), args.Error(1)
    95  }
    96  
    97  func (m *mockLedger) NewHistoryQueryExecutor() (ledger2.HistoryQueryExecutor, error) {
    98  	args := m.Called()
    99  	return args.Get(0).(ledger2.HistoryQueryExecutor), args.Error(1)
   100  }
   101  
   102  func (m *mockLedger) GetPvtDataAndBlockByNum(blockNum uint64, filter ledger2.PvtNsCollFilter) (*ledger2.BlockAndPvtData, error) {
   103  	args := m.Called(blockNum, filter)
   104  	return args.Get(0).(*ledger2.BlockAndPvtData), args.Error(1)
   105  }
   106  
   107  func (m *mockLedger) GetPvtDataByNum(blockNum uint64, filter ledger2.PvtNsCollFilter) ([]*ledger2.TxPvtData, error) {
   108  	args := m.Called(blockNum, filter)
   109  	return args.Get(0).([]*ledger2.TxPvtData), args.Error(1)
   110  }
   111  
   112  func (m *mockLedger) CommitLegacy(blockAndPvtdata *ledger2.BlockAndPvtData, commitOpts *ledger2.CommitOptions) error {
   113  	m.height += 1
   114  	m.previousHash = m.currentHash
   115  	m.currentHash = blockAndPvtdata.Block.Header.DataHash
   116  	args := m.Called(blockAndPvtdata)
   117  	return args.Error(0)
   118  }
   119  
   120  func (m *mockLedger) CommitPvtDataOfOldBlocks(reconciledPvtdata []*ledger2.ReconciledPvtdata, unreconciled ledger2.MissingPvtDataInfo) ([]*ledger2.PvtdataHashMismatch, error) {
   121  	panic("implement me")
   122  }
   123  
   124  func (m *mockLedger) GetMissingPvtDataTracker() (ledger2.MissingPvtDataTracker, error) {
   125  	panic("implement me")
   126  }
   127  
   128  func createLedger(channelID string) (*common.Block, *mockLedger) {
   129  	gb, _ := test.MakeGenesisBlock(channelID)
   130  	ledger := &mockLedger{
   131  		height:       1,
   132  		previousHash: []byte{},
   133  		currentHash:  gb.Header.DataHash,
   134  	}
   135  	return gb, ledger
   136  }
   137  
   138  func TestKVLedgerBlockStorage(t *testing.T) {
   139  	t.Parallel()
   140  	gb, ledger := createLedger("TestLedger")
   141  	block1 := testutil.ConstructBlock(t, 1, gb.Header.DataHash, [][]byte{{1, 2, 3, 4}, {5, 6, 7, 8}}, true)
   142  
   143  	ledger.On("CommitLegacy", mock.Anything).Run(func(args mock.Arguments) {
   144  		b := args.Get(0).(*ledger2.BlockAndPvtData)
   145  		require.Equal(t, uint64(1), b.Block.Header.GetNumber())
   146  		require.Equal(t, gb.Header.DataHash, b.Block.Header.PreviousHash)
   147  		require.Equal(t, block1.Header.DataHash, b.Block.Header.DataHash)
   148  	}).Return(nil)
   149  
   150  	ledger.On("GetBlockByNumber", uint64(0)).Return(gb, nil)
   151  
   152  	committer := NewLedgerCommitter(ledger)
   153  	height, err := committer.LedgerHeight()
   154  	require.Equal(t, uint64(1), height)
   155  	require.NoError(t, err)
   156  
   157  	err = committer.CommitLegacy(&ledger2.BlockAndPvtData{Block: block1}, &ledger2.CommitOptions{})
   158  	require.NoError(t, err)
   159  
   160  	height, err = committer.LedgerHeight()
   161  	require.Equal(t, uint64(2), height)
   162  	require.NoError(t, err)
   163  
   164  	blocks := committer.GetBlocks([]uint64{0})
   165  	require.Equal(t, 1, len(blocks))
   166  	require.NoError(t, err)
   167  }