github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/ledgermgmt/ledgermgmttest/ledgermgmttest.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package ledgermgmttest 8 9 import ( 10 "fmt" 11 "io/ioutil" 12 "os" 13 "path/filepath" 14 "testing" 15 "time" 16 17 "github.com/hechain20/hechain/bccsp/sw" 18 "github.com/hechain20/hechain/common/ledger/testutil" 19 "github.com/hechain20/hechain/common/metrics/disabled" 20 "github.com/hechain20/hechain/core/ledger" 21 "github.com/hechain20/hechain/core/ledger/kvledger" 22 "github.com/hechain20/hechain/core/ledger/ledgermgmt" 23 "github.com/hechain20/hechain/core/ledger/mock" 24 "github.com/hyperledger/fabric-protos-go/common" 25 "github.com/stretchr/testify/require" 26 ) 27 28 // NewInitializer returns an instance of ledgermgmt Initializer 29 // with minimum fields populated so as not to cause a failure during construction of LedgerMgr. 30 // This is intended to be used for creating an instance of LedgerMgr for testing 31 func NewInitializer(testLedgerDir string) *ledgermgmt.Initializer { 32 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 33 if err != nil { 34 panic(fmt.Errorf("Failed to initialize cryptoProvider bccsp: %s", err)) 35 } 36 37 return &ledgermgmt.Initializer{ 38 Config: &ledger.Config{ 39 RootFSPath: testLedgerDir, 40 // empty StateDBConfig means leveldb 41 StateDBConfig: &ledger.StateDBConfig{}, 42 HistoryDBConfig: &ledger.HistoryDBConfig{ 43 Enabled: false, 44 }, 45 PrivateDataConfig: &ledger.PrivateDataConfig{ 46 MaxBatchSize: 5000, 47 BatchesInterval: 1000, 48 PurgeInterval: 100, 49 }, 50 SnapshotsConfig: &ledger.SnapshotsConfig{ 51 RootDir: filepath.Join(testLedgerDir, "snapshots"), 52 }, 53 }, 54 MetricsProvider: &disabled.Provider{}, 55 DeployedChaincodeInfoProvider: &mock.DeployedChaincodeInfoProvider{}, 56 HashProvider: cryptoProvider, 57 HealthCheckRegistry: &mock.HealthCheckRegistry{}, 58 ChaincodeLifecycleEventProvider: &mock.ChaincodeLifecycleEventProvider{}, 59 } 60 } 61 62 // CreateSnapshotWithGenesisBlock creates a snapshot with only genesis block for the given ledgerID and returns 63 // the snapshot directory. It is intended to be used for creating a ledger by snapshot for testing purpose. 64 func CreateSnapshotWithGenesisBlock(t *testing.T, testDir string, ledgerID string, configTxProcessor ledger.CustomTxProcessor) string { 65 // use a tmpdir to create the ledger for ledgerID so that we can create the snapshot 66 tmpDir, err := ioutil.TempDir("", "createsnapshotwithgenesisblock") 67 require.NoError(t, err) 68 defer os.RemoveAll(tmpDir) 69 70 initializer := NewInitializer(tmpDir) 71 initializer.CustomTxProcessors = map[common.HeaderType]ledger.CustomTxProcessor{ 72 common.HeaderType_CONFIG: configTxProcessor, 73 } 74 initializer.Config.SnapshotsConfig.RootDir = testDir 75 ledgerMgr := ledgermgmt.NewLedgerMgr(initializer) 76 defer ledgerMgr.Close() 77 78 _, gb := testutil.NewBlockGenerator(t, ledgerID, false) 79 l, err := ledgerMgr.CreateLedger(ledgerID, gb) 80 require.NoError(t, err) 81 82 require.NoError(t, l.SubmitSnapshotRequest(0)) 83 snapshotDir := kvledger.SnapshotDirForLedgerBlockNum(initializer.Config.SnapshotsConfig.RootDir, ledgerID, 0) 84 snapshotGenerated := func() bool { 85 pendingRequests, err := l.PendingSnapshotRequests() 86 require.NoError(t, err) 87 return len(pendingRequests) == 0 88 } 89 require.Eventually(t, snapshotGenerated, 30*time.Second, 100*time.Millisecond) 90 91 return snapshotDir 92 }