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 }