github.com/defanghe/fabric@v2.1.1+incompatible/core/ledger/ledgermgmt/ledger_mgmt_test.go (about)

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