github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/pause_resume_test.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package kvledger
     8  
     9  import (
    10  	"testing"
    11  
    12  	configtxtest "github.com/hechain20/hechain/common/configtx/test"
    13  	"github.com/hechain20/hechain/core/ledger/kvledger/msgs"
    14  	"github.com/hechain20/hechain/core/ledger/mock"
    15  	"github.com/hyperledger/fabric-protos-go/common"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func TestPauseAndResume(t *testing.T) {
    20  	conf, cleanup := testConfig(t)
    21  	conf.HistoryDBConfig.Enabled = false
    22  	defer cleanup()
    23  	provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    24  
    25  	numLedgers := 10
    26  	activeLedgerIDs, err := provider.List()
    27  	require.NoError(t, err)
    28  	require.Len(t, activeLedgerIDs, 0)
    29  	genesisBlocks := make([]*common.Block, numLedgers)
    30  	for i := 0; i < numLedgers; i++ {
    31  		genesisBlock, _ := configtxtest.MakeGenesisBlock(constructTestLedgerID(i))
    32  		genesisBlocks[i] = genesisBlock
    33  		_, err := provider.CreateFromGenesisBlock(genesisBlock)
    34  		require.NoError(t, err)
    35  	}
    36  	activeLedgerIDs, err = provider.List()
    37  	require.NoError(t, err)
    38  	require.Len(t, activeLedgerIDs, numLedgers)
    39  	provider.Close()
    40  
    41  	// pause channels
    42  	pausedLedgers := []int{1, 3, 5}
    43  	for _, i := range pausedLedgers {
    44  		err = PauseChannel(conf.RootFSPath, constructTestLedgerID(i))
    45  		require.NoError(t, err)
    46  	}
    47  	// pause again should not fail
    48  	err = PauseChannel(conf.RootFSPath, constructTestLedgerID(1))
    49  	require.NoError(t, err)
    50  	// verify ledger status after pause
    51  	provider = testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    52  	assertLedgerStatus(t, provider, genesisBlocks, numLedgers, pausedLedgers)
    53  	provider.Close()
    54  
    55  	// resume channels
    56  	resumedLedgers := []int{1, 5}
    57  	for _, i := range resumedLedgers {
    58  		err = ResumeChannel(conf.RootFSPath, constructTestLedgerID(i))
    59  		require.NoError(t, err)
    60  	}
    61  	// resume again should not fail
    62  	err = ResumeChannel(conf.RootFSPath, constructTestLedgerID(1))
    63  	require.NoError(t, err)
    64  	// verify ledger status after resume
    65  	pausedLedgersAfterResume := []int{3}
    66  	provider = testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    67  	defer provider.Close()
    68  	assertLedgerStatus(t, provider, genesisBlocks, numLedgers, pausedLedgersAfterResume)
    69  
    70  	// open paused channel should fail
    71  	_, err = provider.Open(constructTestLedgerID(3))
    72  	require.EqualError(t, err, "cannot open ledger [ledger_000003], ledger status is [INACTIVE]")
    73  }
    74  
    75  func TestPauseAndResumeErrors(t *testing.T) {
    76  	conf, cleanup := testConfig(t)
    77  	conf.HistoryDBConfig.Enabled = false
    78  	defer cleanup()
    79  	provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    80  
    81  	ledgerID := constructTestLedgerID(0)
    82  	genesisBlock, _ := configtxtest.MakeGenesisBlock(ledgerID)
    83  	_, err := provider.CreateFromGenesisBlock(genesisBlock)
    84  	require.NoError(t, err)
    85  	// purposely set an invalid metatdata
    86  	require.NoError(t, provider.idStore.db.Put(metadataKey(ledgerID), []byte("invalid"), true))
    87  
    88  	// fail if provider is open (e.g., peer is up running)
    89  	err = PauseChannel(conf.RootFSPath, constructTestLedgerID(0))
    90  	require.Error(t, err, "as another peer node command is executing, wait for that command to complete its execution or terminate it before retrying")
    91  
    92  	err = ResumeChannel(conf.RootFSPath, constructTestLedgerID(0))
    93  	require.Error(t, err, "as another peer node command is executing, wait for that command to complete its execution or terminate it before retrying")
    94  
    95  	provider.Close()
    96  
    97  	// fail if ledgerID does not exists
    98  	err = PauseChannel(conf.RootFSPath, "dummy")
    99  	require.Error(t, err, "LedgerID does not exist")
   100  
   101  	err = ResumeChannel(conf.RootFSPath, "dummy")
   102  	require.Error(t, err, "LedgerID does not exist")
   103  
   104  	// error if metadata cannot be unmarshaled
   105  	err = PauseChannel(conf.RootFSPath, ledgerID)
   106  	require.EqualError(t, err, "error unmarshalling ledger metadata: unexpected EOF")
   107  
   108  	err = ResumeChannel(conf.RootFSPath, ledgerID)
   109  	require.EqualError(t, err, "error unmarshalling ledger metadata: unexpected EOF")
   110  }
   111  
   112  // verify status for paused ledgers and non-paused ledgers
   113  func assertLedgerStatus(t *testing.T, provider *Provider, genesisBlocks []*common.Block, numLedgers int, pausedLedgers []int) {
   114  	s := provider.idStore
   115  
   116  	activeLedgerIDs, err := provider.List()
   117  	require.NoError(t, err)
   118  	require.Len(t, activeLedgerIDs, numLedgers-len(pausedLedgers))
   119  	for i := 0; i < numLedgers; i++ {
   120  		if !contains(pausedLedgers, i) {
   121  			require.Contains(t, activeLedgerIDs, constructTestLedgerID(i))
   122  		}
   123  	}
   124  
   125  	for i := 0; i < numLedgers; i++ {
   126  		m, err := s.getLedgerMetadata(constructTestLedgerID(i))
   127  		require.NoError(t, err)
   128  		require.NotNil(t, m)
   129  		if contains(pausedLedgers, i) {
   130  			require.Equal(t, msgs.Status_INACTIVE, m.GetStatus())
   131  		} else {
   132  			require.Equal(t, msgs.Status_ACTIVE, m.GetStatus())
   133  		}
   134  	}
   135  }
   136  
   137  func contains(slice []int, val int) bool {
   138  	for _, item := range slice {
   139  		if item == val {
   140  			return true
   141  		}
   142  	}
   143  	return false
   144  }