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 }