github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/unjoin_channel_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/mock"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestUnjoinChannel(t *testing.T) {
    18  	conf, cleanup := testConfig(t)
    19  	conf.HistoryDBConfig.Enabled = true
    20  	defer cleanup()
    21  
    22  	ledgerID := "ledger_unjoin"
    23  
    24  	provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    25  	activeLedgerIDs, err := provider.List()
    26  	require.NoError(t, err)
    27  	require.Len(t, activeLedgerIDs, 0)
    28  
    29  	genesisBlock, err := configtxtest.MakeGenesisBlock(ledgerID)
    30  	require.NoError(t, err)
    31  	_, err = provider.CreateFromGenesisBlock(genesisBlock)
    32  	require.NoError(t, err)
    33  
    34  	activeLedgerIDs, err = provider.List()
    35  	require.NoError(t, err)
    36  	require.Len(t, activeLedgerIDs, 1)
    37  	require.Contains(t, activeLedgerIDs, ledgerID)
    38  	provider.Close()
    39  
    40  	// Unjoin the channel from the peer
    41  	err = UnjoinChannel(conf, ledgerID)
    42  	require.NoError(t, err)
    43  
    44  	// channel should no longer be present in the channel list
    45  	provider = testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    46  	defer provider.Close()
    47  
    48  	activeLedgerIDs, err = provider.List()
    49  	require.NoError(t, err)
    50  	require.Len(t, activeLedgerIDs, 0)
    51  	require.NotContains(t, activeLedgerIDs, ledgerID)
    52  
    53  	// check underlying databases have been removed
    54  	verifyLedgerDoesNotExist(t, provider, ledgerID)
    55  }
    56  
    57  // Unjoining an unjoined channel is an error.
    58  func TestUnjoinUnjoinedChannelErrors(t *testing.T) {
    59  	conf, cleanup := testConfig(t)
    60  	conf.HistoryDBConfig.Enabled = false
    61  	defer cleanup()
    62  
    63  	ledgerID := "ledger_unjoin_unjoined"
    64  
    65  	provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    66  	genesisBlock, err := configtxtest.MakeGenesisBlock(ledgerID)
    67  	require.NoError(t, err)
    68  	_, err = provider.CreateFromGenesisBlock(genesisBlock)
    69  	require.NoError(t, err)
    70  	provider.Close()
    71  
    72  	// unjoin the channel
    73  	require.NoError(t, UnjoinChannel(conf, ledgerID))
    74  
    75  	provider = testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    76  	activeLedgerIDs, err := provider.List()
    77  	require.NoError(t, err)
    78  	require.Len(t, activeLedgerIDs, 0)
    79  	provider.Close()
    80  
    81  	// unjoining an unjoined channel is an error.
    82  	require.EqualError(t, UnjoinChannel(conf, ledgerID),
    83  		"unjoin channel [ledger_unjoin_unjoined]: cannot update ledger status, ledger [ledger_unjoin_unjoined] does not exist")
    84  }
    85  
    86  func TestUnjoinWithRunningPeerErrors(t *testing.T) {
    87  	conf, cleanup := testConfig(t)
    88  	conf.HistoryDBConfig.Enabled = false
    89  	defer cleanup()
    90  
    91  	provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    92  	defer provider.Close()
    93  
    94  	ledgerID := constructTestLedgerID(1)
    95  	genesisBlock, _ := configtxtest.MakeGenesisBlock(ledgerID)
    96  	_, err := provider.CreateFromGenesisBlock(genesisBlock)
    97  	require.NoError(t, err)
    98  
    99  	// Fail when provider is open (e.g. peer is running)
   100  	require.ErrorContains(t, UnjoinChannel(conf, ledgerID),
   101  		"as another peer node command is executing, wait for that command to complete its execution or terminate it before retrying: lock is already acquired on file")
   102  }
   103  
   104  func TestUnjoinWithMissingChannelErrors(t *testing.T) {
   105  	conf, cleanup := testConfig(t)
   106  	conf.HistoryDBConfig.Enabled = false
   107  	defer cleanup()
   108  
   109  	// fail if channel does not exist
   110  	require.EqualError(t, UnjoinChannel(conf, "__invalid_channel"),
   111  		"unjoin channel [__invalid_channel]: cannot update ledger status, ledger [__invalid_channel] does not exist")
   112  }
   113  
   114  func TestUnjoinChannelWithInvalidMetadataErrors(t *testing.T) {
   115  	conf, cleanup := testConfig(t)
   116  	conf.HistoryDBConfig.Enabled = false
   117  	defer cleanup()
   118  
   119  	provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
   120  
   121  	ledgerID := constructTestLedgerID(99)
   122  	genesisBlock, _ := configtxtest.MakeGenesisBlock(ledgerID)
   123  	_, err := provider.CreateFromGenesisBlock(genesisBlock)
   124  	require.NoError(t, err)
   125  
   126  	// purposely set an invalid metatdata
   127  	require.NoError(t, provider.idStore.db.Put(metadataKey(ledgerID), []byte("invalid"), true))
   128  	provider.Close()
   129  
   130  	// fail if metadata can not be unmarshaled
   131  	require.EqualError(t, UnjoinChannel(conf, ledgerID),
   132  		"unjoin channel [ledger_000099]: error unmarshalling ledger metadata: unexpected EOF")
   133  }