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  }