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 }