Skip to content

Commit b5bfe6a

Browse files
committed
FAB-3400: Improve unit tests for ledger/kvledger
Add TestRecovery to test recoverUnderConstructionLedger. 2 cases 1. geneis block is written, ledgerID is not created 2. genesis block is not-written Added checks to make sure undeconstruction flag is cleared and ledger can be opened. Change-Id: I69264a469444cba938d6a85523115e8bd1993ee4 Signed-off-by: Balaji Viswanathan <[email protected]>
1 parent a97886a commit b5bfe6a

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

core/ledger/kvledger/kv_ledger_provider_test.go

+47
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ func TestLedgerProvider(t *testing.T) {
6060
testutil.AssertEquals(t, ledgerIds[i], constructTestLedgerID(i))
6161
}
6262
for i := 0; i < numLedgers; i++ {
63+
status, _ := provider.Exists(constructTestLedgerID(i))
64+
testutil.AssertEquals(t, status, true)
6365
ledger, err := provider.Open(constructTestLedgerID(i))
6466
testutil.AssertNoError(t, err, "")
6567
bcInfo, err := ledger.GetBlockchainInfo()
@@ -71,10 +73,55 @@ func TestLedgerProvider(t *testing.T) {
7173
_, err = provider.Create(gb)
7274
testutil.AssertEquals(t, err, ErrLedgerIDExists)
7375

76+
status, err := provider.Exists(constructTestLedgerID(numLedgers))
77+
testutil.AssertNoError(t, err, "Failed to check for ledger existence")
78+
testutil.AssertEquals(t, false, status)
79+
7480
_, err = provider.Open(constructTestLedgerID(numLedgers))
7581
testutil.AssertEquals(t, err, ErrNonExistingLedgerID)
7682
}
7783

84+
func TestRecovery(t *testing.T) {
85+
env := newTestEnv(t)
86+
defer env.cleanup()
87+
provider, _ := NewProvider()
88+
89+
// now create the genesis block
90+
genesisBlock, _ := configtxtest.MakeGenesisBlock(constructTestLedgerID(1))
91+
ledger, err := provider.(*Provider).openInternal(constructTestLedgerID(1))
92+
ledger.Commit(genesisBlock)
93+
ledger.Close()
94+
95+
// Case 1: assume a crash happens, force underconstruction flag to be set to simulate
96+
// a failure where ledgerid is being created - ie., block is written but flag is not unset
97+
provider.(*Provider).idStore.setUnderConstructionFlag(constructTestLedgerID(1))
98+
provider.Close()
99+
100+
// construct a new provider to invoke recovery
101+
provider, err = NewProvider()
102+
testutil.AssertNoError(t, err, "Provider failed to recover an underConstructionLedger")
103+
// verify the underecoveryflag and open the ledger
104+
flag, err := provider.(*Provider).idStore.getUnderConstructionFlag()
105+
testutil.AssertNoError(t, err, "Failed to read the underconstruction flag")
106+
testutil.AssertEquals(t, flag, "")
107+
ledger, err = provider.Open(constructTestLedgerID(1))
108+
testutil.AssertNoError(t, err, "Failed to open the ledger")
109+
ledger.Close()
110+
111+
// Case 0: assume a crash happens before the genesis block of ledger 2 is comitted
112+
// Open the ID store (inventory of chainIds/ledgerIds)
113+
provider.(*Provider).idStore.setUnderConstructionFlag(constructTestLedgerID(2))
114+
provider.Close()
115+
116+
// construct a new provider to invoke recovery
117+
provider, err = NewProvider()
118+
testutil.AssertNoError(t, err, "Provider failed to recover an underConstructionLedger")
119+
flag, err = provider.(*Provider).idStore.getUnderConstructionFlag()
120+
testutil.AssertNoError(t, err, "Failed to read the underconstruction flag")
121+
testutil.AssertEquals(t, flag, "")
122+
123+
}
124+
78125
func TestMultipleLedgerBasicRW(t *testing.T) {
79126
env := newTestEnv(t)
80127
defer env.cleanup()

core/ledger/kvledger/kv_ledger_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
ledgertestutil "github.com/hyperledger/fabric/core/ledger/testutil"
2727
"github.com/hyperledger/fabric/protos/common"
2828
"github.com/hyperledger/fabric/protos/ledger/queryresult"
29+
"github.com/hyperledger/fabric/protos/peer"
2930
putils "github.com/hyperledger/fabric/protos/utils"
3031
"github.com/stretchr/testify/assert"
3132
)
@@ -100,6 +101,14 @@ func TestKVLedgerBlockStorage(t *testing.T) {
100101
retrievedTxEnv2 := processedTran2.TransactionEnvelope
101102
testutil.AssertEquals(t, retrievedTxEnv2, txEnv2)
102103

104+
// get the tran id from the 2nd block, then use it to test GetBlockByTxID
105+
b1, _ = ledger.GetBlockByTxID(txID2)
106+
testutil.AssertEquals(t, b1, block1)
107+
108+
// get the transaction validation code for this transaction id
109+
validCode, _ := ledger.GetTxValidationCodeByTxID(txID2)
110+
testutil.AssertEquals(t, validCode, peer.TxValidationCode_VALID)
111+
103112
}
104113

105114
func TestKVLedgerDBRecovery(t *testing.T) {

0 commit comments

Comments
 (0)