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