github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/common/ledger/blkstorage/blkstoragetest/blkstoragetest.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package blkstoragetest
     8  
     9  import (
    10  	"crypto/sha256"
    11  	"hash"
    12  	"io/ioutil"
    13  	"os"
    14  	"path/filepath"
    15  	"testing"
    16  
    17  	"github.com/hechain20/hechain/common/ledger/blkstorage"
    18  	"github.com/hechain20/hechain/common/metrics/disabled"
    19  	"github.com/hechain20/hechain/protoutil"
    20  	"github.com/hyperledger/fabric-protos-go/common"
    21  	"github.com/stretchr/testify/require"
    22  )
    23  
    24  var (
    25  	testNewHashFunc = func() (hash.Hash, error) {
    26  		return sha256.New(), nil
    27  	}
    28  
    29  	attrsToIndex = []blkstorage.IndexableAttr{
    30  		blkstorage.IndexableAttrBlockHash,
    31  		blkstorage.IndexableAttrBlockNum,
    32  		blkstorage.IndexableAttrTxID,
    33  		blkstorage.IndexableAttrBlockNumTranNum,
    34  	}
    35  )
    36  
    37  // BootstrapBlockstoreFromSnapshot does the following:
    38  // - create a block store using the provided blocks
    39  // - generate a snapshot from the block store
    40  // - bootstrap another block store from the snapshot
    41  func BootstrapBlockstoreFromSnapshot(t *testing.T, ledgerName string, blocks []*common.Block) (*blkstorage.BlockStore, func()) {
    42  	require.NotEqual(t, 0, len(blocks))
    43  
    44  	testDir, err := ioutil.TempDir("", ledgerName)
    45  	require.NoError(t, err)
    46  	snapshotDir := filepath.Join(testDir, "snapshot")
    47  	require.NoError(t, os.Mkdir(snapshotDir, 0o755))
    48  
    49  	conf := blkstorage.NewConf(testDir, 0)
    50  	indexConfig := &blkstorage.IndexConfig{AttrsToIndex: attrsToIndex}
    51  	provider, err := blkstorage.NewProvider(conf, indexConfig, &disabled.Provider{})
    52  	require.NoError(t, err)
    53  
    54  	// create an original store from the provided blocks so that we can create a snapshot
    55  	originalBlkStore, err := provider.Open(ledgerName + "original")
    56  	require.NoError(t, err)
    57  
    58  	for _, block := range blocks {
    59  		require.NoError(t, originalBlkStore.AddBlock(block))
    60  	}
    61  
    62  	_, err = originalBlkStore.ExportTxIds(snapshotDir, testNewHashFunc)
    63  	require.NoError(t, err)
    64  
    65  	lastBlockInSnapshot := blocks[len(blocks)-1]
    66  	snapshotInfo := &blkstorage.SnapshotInfo{
    67  		LastBlockHash:     protoutil.BlockHeaderHash(lastBlockInSnapshot.Header),
    68  		LastBlockNum:      lastBlockInSnapshot.Header.Number,
    69  		PreviousBlockHash: lastBlockInSnapshot.Header.PreviousHash,
    70  	}
    71  
    72  	err = provider.ImportFromSnapshot(ledgerName, snapshotDir, snapshotInfo)
    73  	require.NoError(t, err)
    74  	blockStore, err := provider.Open(ledgerName)
    75  	require.NoError(t, err)
    76  
    77  	cleanup := func() {
    78  		provider.Close()
    79  		os.RemoveAll(testDir)
    80  	}
    81  	return blockStore, cleanup
    82  }