github.com/kaituanwang/hyperledger@v2.0.1+incompatible/core/ledger/ledgermgmt/ledger_mgmt_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  SPDX-License-Identifier: Apache-2.0
     4  */
     5  
     6  package ledgermgmt
     7  
     8  import (
     9  	"fmt"
    10  	"io/ioutil"
    11  	"os"
    12  	"testing"
    13  
    14  	"github.com/hyperledger/fabric/bccsp/sw"
    15  	"github.com/hyperledger/fabric/common/configtx/test"
    16  	"github.com/hyperledger/fabric/common/metrics/disabled"
    17  	"github.com/hyperledger/fabric/core/ledger"
    18  	"github.com/hyperledger/fabric/core/ledger/cceventmgmt"
    19  	"github.com/hyperledger/fabric/core/ledger/mock"
    20  	"github.com/stretchr/testify/assert"
    21  )
    22  
    23  func TestLedgerMgmt(t *testing.T) {
    24  	testDir, err := ioutil.TempDir("", "ledgermgmt")
    25  	if err != nil {
    26  		t.Fatalf("Failed to create ledger directory: %s", err)
    27  	}
    28  	initializer, err := constructDefaultInitializer(testDir)
    29  	if err != nil {
    30  		t.Fatalf("Failed to create default initializer: %s", err)
    31  	}
    32  
    33  	ledgerMgr := NewLedgerMgr(initializer)
    34  	defer func() {
    35  		os.RemoveAll(testDir)
    36  	}()
    37  
    38  	numLedgers := 10
    39  	ledgers := make([]ledger.PeerLedger, numLedgers)
    40  	for i := 0; i < numLedgers; i++ {
    41  		cid := constructTestLedgerID(i)
    42  		gb, _ := test.MakeGenesisBlock(cid)
    43  		l, err := ledgerMgr.CreateLedger(cid, gb)
    44  		assert.NoError(t, err)
    45  		ledgers[i] = l
    46  	}
    47  
    48  	ids, _ := ledgerMgr.GetLedgerIDs()
    49  	assert.Len(t, ids, numLedgers)
    50  	for i := 0; i < numLedgers; i++ {
    51  		assert.Equal(t, constructTestLedgerID(i), ids[i])
    52  	}
    53  
    54  	ledgerID := constructTestLedgerID(2)
    55  	t.Logf("Ledger selected for test = %s", ledgerID)
    56  	_, err = ledgerMgr.OpenLedger(ledgerID)
    57  	assert.Equal(t, ErrLedgerAlreadyOpened, err)
    58  
    59  	l := ledgers[2]
    60  	l.Close()
    61  	// attempt to close the same ledger twice and ensure it doesn't panic
    62  	assert.NotPanics(t, l.Close)
    63  
    64  	_, err = ledgerMgr.OpenLedger(ledgerID)
    65  	assert.NoError(t, err)
    66  
    67  	_, err = ledgerMgr.OpenLedger(ledgerID)
    68  	assert.Equal(t, ErrLedgerAlreadyOpened, err)
    69  	// close all opened ledgers and ledger mgmt
    70  	ledgerMgr.Close()
    71  
    72  	// Recreate LedgerMgr with existing ledgers
    73  	ledgerMgr = NewLedgerMgr(initializer)
    74  	_, err = ledgerMgr.OpenLedger(ledgerID)
    75  	assert.NoError(t, err)
    76  	ledgerMgr.Close()
    77  }
    78  
    79  func TestChaincodeInfoProvider(t *testing.T) {
    80  	testDir, err := ioutil.TempDir("", "ledgermgmt")
    81  	if err != nil {
    82  		t.Fatalf("Failed to create ledger directory: %s", err)
    83  	}
    84  	initializer, err := constructDefaultInitializer(testDir)
    85  	if err != nil {
    86  		t.Fatalf("Failed to create default initializer: %s", err)
    87  	}
    88  
    89  	ledgerMgr := NewLedgerMgr(initializer)
    90  	defer func() {
    91  		ledgerMgr.Close()
    92  		os.RemoveAll(testDir)
    93  	}()
    94  
    95  	gb, _ := test.MakeGenesisBlock("ledger1")
    96  	ledgerMgr.CreateLedger("ledger1", gb)
    97  
    98  	mockDeployedCCInfoProvider := &mock.DeployedChaincodeInfoProvider{}
    99  	mockDeployedCCInfoProvider.ChaincodeInfoStub = func(channelName, ccName string, qe ledger.SimpleQueryExecutor) (*ledger.DeployedChaincodeInfo, error) {
   100  		return constructTestCCInfo(ccName, ccName, ccName), nil
   101  	}
   102  
   103  	ccInfoProvider := &chaincodeInfoProviderImpl{
   104  		ledgerMgr,
   105  		mockDeployedCCInfoProvider,
   106  	}
   107  	_, err = ccInfoProvider.GetDeployedChaincodeInfo("ledger2", constructTestCCDef("cc2", "1.0", "cc2Hash"))
   108  	t.Logf("Expected error received = %s", err)
   109  	assert.Error(t, err)
   110  
   111  	ccInfo, err := ccInfoProvider.GetDeployedChaincodeInfo("ledger1", constructTestCCDef("cc1", "non-matching-version", "cc1"))
   112  	assert.NoError(t, err)
   113  	assert.Nil(t, ccInfo)
   114  
   115  	ccInfo, err = ccInfoProvider.GetDeployedChaincodeInfo("ledger1", constructTestCCDef("cc1", "cc1", "non-matching-hash"))
   116  	assert.NoError(t, err)
   117  	assert.Nil(t, ccInfo)
   118  
   119  	ccInfo, err = ccInfoProvider.GetDeployedChaincodeInfo("ledger1", constructTestCCDef("cc1", "cc1", "cc1"))
   120  	assert.NoError(t, err)
   121  	assert.Equal(t, constructTestCCInfo("cc1", "cc1", "cc1"), ccInfo)
   122  }
   123  
   124  func constructDefaultInitializer(testDir string) (*Initializer, error) {
   125  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
   126  	if err != nil {
   127  		return nil, err
   128  	}
   129  	return &Initializer{
   130  		Config: &ledger.Config{
   131  			RootFSPath:    testDir,
   132  			StateDBConfig: &ledger.StateDBConfig{},
   133  			PrivateDataConfig: &ledger.PrivateDataConfig{
   134  				MaxBatchSize:    5000,
   135  				BatchesInterval: 1000,
   136  				PurgeInterval:   100,
   137  			},
   138  			HistoryDBConfig: &ledger.HistoryDBConfig{
   139  				Enabled: true,
   140  			},
   141  		},
   142  
   143  		MetricsProvider:               &disabled.Provider{},
   144  		DeployedChaincodeInfoProvider: &mock.DeployedChaincodeInfoProvider{},
   145  		Hasher:                        cryptoProvider,
   146  	}, nil
   147  }
   148  
   149  func constructTestLedgerID(i int) string {
   150  	return fmt.Sprintf("ledger_%06d", i)
   151  }
   152  
   153  func constructTestCCInfo(ccName, version, hash string) *ledger.DeployedChaincodeInfo {
   154  	return &ledger.DeployedChaincodeInfo{
   155  		Name:    ccName,
   156  		Hash:    []byte(hash),
   157  		Version: version,
   158  	}
   159  }
   160  
   161  func constructTestCCDef(ccName, version, hash string) *cceventmgmt.ChaincodeDefinition {
   162  	return &cceventmgmt.ChaincodeDefinition{
   163  		Name:    ccName,
   164  		Hash:    []byte(hash),
   165  		Version: version,
   166  	}
   167  }