github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/delete_partial_ledgers_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 "github.com/hechain20/hechain/core/ledger/kvledger/msgs" 13 "github.com/hechain20/hechain/core/ledger/mock" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestDeleteUnderDeletionLedger(t *testing.T) { 18 conf, cleanup := testConfig(t) 19 conf.HistoryDBConfig.Enabled = true 20 defer cleanup() 21 22 provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{}) 23 defer provider.Close() 24 25 // Set up a ledger and mark it as "under deletion." This emulates the 26 // state when a peer was in the process of unjoining a channel and the 27 // unjoin operation crashed mid delete. 28 ledgerID := constructTestLedger(t, provider, 0) 29 verifyLedgerIDExists(t, provider, ledgerID, msgs.Status_ACTIVE) 30 31 // doom the newly created ledger 32 require.NoError(t, provider.idStore.updateLedgerStatus(ledgerID, msgs.Status_UNDER_DELETION)) 33 verifyLedgerIDExists(t, provider, ledgerID, msgs.Status_UNDER_DELETION) 34 35 // explicitly call the delete on the provider. 36 provider.deletePartialLedgers() 37 38 // goodbye, ledger. 39 verifyLedgerDoesNotExist(t, provider, ledgerID) 40 } 41 42 func TestDeletePartialLedgers(t *testing.T) { 43 conf, cleanup := testConfig(t) 44 conf.HistoryDBConfig.Enabled = true 45 defer cleanup() 46 47 provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{}) 48 defer provider.Close() 49 50 targetStatus := []msgs.Status{ 51 msgs.Status_ACTIVE, 52 msgs.Status_UNDER_DELETION, 53 msgs.Status_ACTIVE, 54 msgs.Status_UNDER_DELETION, 55 msgs.Status_UNDER_CONSTRUCTION, 56 } 57 58 constructPartialLedgers(t, provider, targetStatus) 59 60 // delete the under deletion ledgers 61 err := provider.deletePartialLedgers() 62 require.NoError(t, err) 63 64 verifyPartialLedgers(t, provider, targetStatus) 65 } 66 67 func TestNewProviderDeletesPartialLedgers(t *testing.T) { 68 conf, cleanup := testConfig(t) 69 conf.HistoryDBConfig.Enabled = true 70 defer cleanup() 71 72 provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{}) 73 74 targetStatus := []msgs.Status{ 75 msgs.Status_ACTIVE, 76 msgs.Status_UNDER_DELETION, 77 msgs.Status_UNDER_CONSTRUCTION, 78 msgs.Status_ACTIVE, 79 msgs.Status_UNDER_DELETION, 80 } 81 82 constructPartialLedgers(t, provider, targetStatus) 83 84 // Close and re-open the provider. The initialization should have scrubbed the partial ledgers. 85 provider.Close() 86 provider = testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{}) 87 defer provider.Close() 88 89 verifyPartialLedgers(t, provider, targetStatus) 90 } 91 92 // Construct a series of test ledgers, each with a target status. 93 func constructPartialLedgers(t *testing.T, provider *Provider, targetStatus []msgs.Status) { 94 for i := 0; i < len(targetStatus); i++ { 95 ledgerID := constructTestLedger(t, provider, i) 96 require.NoError(t, provider.idStore.updateLedgerStatus(ledgerID, targetStatus[i])) 97 verifyLedgerIDExists(t, provider, ledgerID, targetStatus[i]) 98 } 99 } 100 101 // Check that all UNDER_CONSTRUCTION and UNDER_DELETION ledgers were scrubbed. 102 func verifyPartialLedgers(t *testing.T, provider *Provider, targetStatus []msgs.Status) { 103 // Also double-check that deleted ledgers do not appear in the provider listing. 104 activeLedgers, err := provider.List() 105 require.NoError(t, err) 106 107 for i := 0; i < len(targetStatus); i++ { 108 ledgerID := constructTestLedgerID(i) 109 if targetStatus[i] == msgs.Status_UNDER_CONSTRUCTION || targetStatus[i] == msgs.Status_UNDER_DELETION { 110 verifyLedgerDoesNotExist(t, provider, ledgerID) 111 require.NotContains(t, ledgerID, activeLedgers) 112 } else { 113 verifyLedgerIDExists(t, provider, ledgerID, targetStatus[i]) 114 require.Contains(t, activeLedgers, ledgerID) 115 } 116 } 117 }