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 }