Skip to content

Commit

Permalink
kvledger/test for snapshot generation and bootstrap
Browse files Browse the repository at this point in the history
Signed-off-by: manish <manish.sethi@gmail.com>
  • Loading branch information
manish-sethi authored and denyeart committed Nov 10, 2020
1 parent e5ebb7b commit 4f1e093
Show file tree
Hide file tree
Showing 15 changed files with 439 additions and 125 deletions.
3 changes: 3 additions & 0 deletions core/ledger/internal/version/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ func (h *Height) Compare(h1 *Height) int {

// String returns string for printing
func (h *Height) String() string {
if h == nil {
return "<nil>"
}
return fmt.Sprintf("{BlockNum: %d, TxNum: %d}", h.BlockNum, h.TxNum)
}

Expand Down
4 changes: 4 additions & 0 deletions core/ledger/kvledger/tests/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@ func (c *client) causeMissingPvtData(txIndex uint64) {
c.simulatedTrans[txIndex].Pvtws = nil
}

func (c *client) discardSimulation() {
c.simulatedTrans = nil
}

func (c *client) retrieveCommittedBlocksAndPvtdata(startNum, endNum uint64) []*ledger.BlockAndPvtData {
data := []*ledger.BlockAndPvtData{}
for i := startNum; i <= endNum; i++ {
Expand Down
4 changes: 2 additions & 2 deletions core/ledger/kvledger/tests/customtx_processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func TestReadWriteCustomTxProcessor(t *testing.T) {
defer env.cleanup()
env.initLedgerMgmt()

l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")
l.simulateDataTx("tx0", func(s *simulator) {
s.setState("ns", "key1", "value1")
s.setState("ns", "key2", "value2")
Expand Down Expand Up @@ -90,7 +90,7 @@ func TestRangeReadAndWriteCustomTxProcessor(t *testing.T) {
defer env.cleanup()
env.initLedgerMgmt()

l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")
l.simulateDataTx("tx0", func(s *simulator) {
s.setState("ns", "key1", "value1")
s.setState("ns", "key2", "value2")
Expand Down
70 changes: 32 additions & 38 deletions core/ledger/kvledger/tests/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ SPDX-License-Identifier: Apache-2.0
package tests

import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
Expand All @@ -15,22 +16,18 @@ import (

"github.com/hyperledger/fabric-protos-go/common"
"github.com/hyperledger/fabric-protos-go/peer"
"github.com/hyperledger/fabric/bccsp"
"github.com/hyperledger/fabric/bccsp/sw"
"github.com/hyperledger/fabric/common/ledger/blkstorage"
"github.com/hyperledger/fabric/common/metrics/disabled"
"github.com/hyperledger/fabric/core/chaincode/implicitcollection"
"github.com/hyperledger/fabric/core/chaincode/lifecycle"
"github.com/hyperledger/fabric/core/common/privdata"
"github.com/hyperledger/fabric/core/container/externalbuilder"
"github.com/hyperledger/fabric/core/ledger"
"github.com/hyperledger/fabric/core/ledger/kvledger"
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
corepeer "github.com/hyperledger/fabric/core/peer"
"github.com/hyperledger/fabric/core/scc/lscc"
"github.com/hyperledger/fabric/internal/fileutil"
"github.com/hyperledger/fabric/msp"
"github.com/hyperledger/fabric/msp/mgmt"
"github.com/hyperledger/fabric/protoutil"
"github.com/stretchr/testify/require"
)

Expand All @@ -51,19 +48,11 @@ type env struct {
}

func newEnv(t *testing.T) *env {
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
return newEnvWithInitializer(t, &ledgermgmt.Initializer{
HashProvider: cryptoProvider,
EbMetadataProvider: &externalbuilder.MetadataProvider{
DurablePath: "testdata",
},
})
return newEnvWithInitializer(t, &ledgermgmt.Initializer{})
}

func newEnvWithInitializer(t *testing.T, initializer *ledgermgmt.Initializer) *env {
populateMissingsWithTestDefaults(t, initializer)

return &env{
t: t,
initializer: initializer,
Expand Down Expand Up @@ -210,14 +199,7 @@ func populateMissingsWithTestDefaults(t *testing.T, initializer *ledgermgmt.Init
}

if initializer.MembershipInfoProvider == nil {
identityDeserializerFactory := func(chainID string) msp.IdentityDeserializer {
return mgmt.GetManagerForChain(chainID)
}
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
mspID := "test-mspid"
membershipInfoProvider := privdata.NewMembershipInfoProvider(mspID, createSelfSignedData(cryptoProvider), identityDeserializerFactory)
initializer.MembershipInfoProvider = membershipInfoProvider
initializer.MembershipInfoProvider = &membershipInfoProvider{myOrgMSPID: "test-mspid"}
}

if initializer.MetricsProvider == nil {
Expand Down Expand Up @@ -260,23 +242,16 @@ func populateMissingsWithTestDefaults(t *testing.T, initializer *ledgermgmt.Init
RootDir: filepath.Join(initializer.Config.RootFSPath, "snapshots"),
}
}
}

func createSelfSignedData(cryptoProvider bccsp.BCCSP) protoutil.SignedData {
sID := mgmt.GetLocalSigningIdentityOrPanic(cryptoProvider)
msg := make([]byte, 32)
sig, err := sID.Sign(msg)
if err != nil {
logger.Panicf("Failed creating self signed data because message signing failed: %v", err)
}
peerIdentity, err := sID.Serialize()
if err != nil {
logger.Panicf("Failed creating self signed data because peer identity couldn't be serialized: %v", err)
if initializer.HashProvider == nil {
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)
initializer.HashProvider = cryptoProvider
}
return protoutil.SignedData{
Data: msg,
Signature: sig,
Identity: peerIdentity,

if initializer.EbMetadataProvider == nil {
initializer.EbMetadataProvider = &externalbuilder.MetadataProvider{
DurablePath: "testdata",
}
}
}

Expand Down Expand Up @@ -336,3 +311,22 @@ func createDeployedCCInfoProvider(orgMSPIDs []string) ledger.DeployedChaincodeIn
orgMSPIDs: orgMSPIDs,
}
}

type membershipInfoProvider struct {
myOrgMSPID string
}

func (p *membershipInfoProvider) AmMemberOf(channelName string, collectionPolicyConfig *peer.CollectionPolicyConfig) (bool, error) {
members := convertFromMemberOrgsPolicy(collectionPolicyConfig)
fmt.Printf("memebers = %s\n", members)
for _, m := range members {
if m == p.myOrgMSPID {
return true, nil
}
}
return false, nil
}

func (p *membershipInfoProvider) MyImplicitCollectionName() string {
return implicitcollection.NameForOrg(p.myOrgMSPID)
}
9 changes: 2 additions & 7 deletions core/ledger/kvledger/tests/ledger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,14 @@ SPDX-License-Identifier: Apache-2.0
package tests

import (
"fmt"
"os"
"testing"

"github.com/hyperledger/fabric/common/flogging"
msptesttools "github.com/hyperledger/fabric/msp/mgmt/testtools"
)

func TestMain(m *testing.M) {
flogging.ActivateSpec("lockbasedtxmgr,statevalidator,statebasedval,statecouchdb,valimpl,pvtstatepurgemgmt,confighistory,kvledger,leveldbhelper=debug")
if err := msptesttools.LoadMSPSetupForTesting(); err != nil {
panic(fmt.Errorf("Could not load msp config, err %s", err))
}
os.Exit(m.Run())
}

Expand All @@ -29,8 +24,8 @@ func TestLedgerAPIs(t *testing.T) {
env.initLedgerMgmt()

// create two ledgers
testLedger1 := env.createTestLedger("ledger1")
testLedger2 := env.createTestLedger("ledger2")
testLedger1 := env.createTestLedgerFromGenesisBlk("ledger1")
testLedger2 := env.createTestLedgerFromGenesisBlk("ledger2")

// populate ledgers with sample data
dataHelper := newSampleDataHelper(t)
Expand Down
15 changes: 3 additions & 12 deletions core/ledger/kvledger/tests/missing_pvtdata_retrieval_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ import (
"testing"
"time"

"github.com/hyperledger/fabric/bccsp/sw"
"github.com/hyperledger/fabric/core/container/externalbuilder"
"github.com/hyperledger/fabric/core/ledger"
"github.com/hyperledger/fabric/core/ledger/kvledger"
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
Expand Down Expand Up @@ -75,7 +73,7 @@ func TestGetMissingPvtData(t *testing.T) {
env := newEnv(t)
defer env.cleanup()
env.initLedgerMgmt()
l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")

blk, expectedMissingPvtDataInfo := setup(l)

Expand Down Expand Up @@ -124,9 +122,6 @@ func TestGetMissingPvtData(t *testing.T) {
})

t.Run("get deprioritized missing data", func(t *testing.T) {
cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
require.NoError(t, err)

initializer := &ledgermgmt.Initializer{
Config: &ledger.Config{
PrivateDataConfig: &ledger.PrivateDataConfig{
Expand All @@ -136,19 +131,15 @@ func TestGetMissingPvtData(t *testing.T) {
DeprioritizedDataReconcilerInterval: 120 * time.Minute,
},
},
HashProvider: cryptoProvider,
EbMetadataProvider: &externalbuilder.MetadataProvider{
DurablePath: "testdata",
},
}
env := newEnvWithInitializer(t, initializer)
defer env.cleanup()
env.initLedgerMgmt()
l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")

_, expectedMissingPvtDataInfo := setup(l)

_, err = l.commitPvtDataOfOldBlocks(nil, expectedMissingPvtDataInfo)
_, err := l.commitPvtDataOfOldBlocks(nil, expectedMissingPvtDataInfo)
require.NoError(t, err)
for i := 0; i < 5; i++ {
l.verifyMissingPvtDataSameAs(int(2), ledger.MissingPvtDataInfo{})
Expand Down
8 changes: 4 additions & 4 deletions core/ledger/kvledger/tests/pvtdata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func TestMissingCollConfig(t *testing.T) {
env := newEnv(t)
defer env.cleanup()
env.initLedgerMgmt()
l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")

collConf := []*collConf{{name: "coll1", btl: 5}}

Expand Down Expand Up @@ -70,7 +70,7 @@ func TestTxWithMissingPvtdata(t *testing.T) {
env := newEnv(t)
defer env.cleanup()
env.initLedgerMgmt()
l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")

collConf := []*collConf{{name: "coll1", btl: 5}}

Expand Down Expand Up @@ -116,7 +116,7 @@ func TestTxWithWrongPvtdata(t *testing.T) {
env := newEnv(t)
defer env.cleanup()
env.initLedgerMgmt()
l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")

collConf := []*collConf{{name: "coll1", btl: 5}}

Expand All @@ -142,7 +142,7 @@ func TestBTL(t *testing.T) {
env := newEnv(t)
defer env.cleanup()
env.initLedgerMgmt()
l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")
collConf := []*collConf{{name: "coll1", btl: 0}, {name: "coll2", btl: 5}}

// deploy cc1 with 'collConf'
Expand Down
4 changes: 2 additions & 2 deletions core/ledger/kvledger/tests/rebuild_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func TestRebuildComponents(t *testing.T) {
defer env.cleanup()
env.initLedgerMgmt()

l1, l2 := env.createTestLedger("ledger1"), env.createTestLedger("ledger2")
l1, l2 := env.createTestLedgerFromGenesisBlk("ledger1"), env.createTestLedgerFromGenesisBlk("ledger2")
dataHelper := newSampleDataHelper(t)

dataHelper.populateLedger(l1)
Expand Down Expand Up @@ -65,7 +65,7 @@ func TestRebuildComponentsWithBTL(t *testing.T) {
env := newEnv(t)
defer env.cleanup()
env.initLedgerMgmt()
l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")
collConf := []*collConf{{name: "coll1", btl: 0}, {name: "coll2", btl: 1}}

// deploy cc1 with 'collConf'
Expand Down
6 changes: 3 additions & 3 deletions core/ledger/kvledger/tests/reset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func TestResetAllLedgers(t *testing.T) {
ledgerIDs := make([]string, numLedgers)
for i := 0; i < numLedgers; i++ {
ledgerIDs[i] = fmt.Sprintf("ledger-%d", i)
l := env.createTestLedger(ledgerIDs[i])
l := env.createTestLedgerFromGenesisBlk(ledgerIDs[i])
dataHelper.populateLedger(l)
dataHelper.verifyLedgerContent(l)
gb, err := l.lgr.GetBlockByNumber(0)
Expand Down Expand Up @@ -108,7 +108,7 @@ func TestResetAllLedgersWithBTL(t *testing.T) {
env := newEnv(t)
defer env.cleanup()
env.initLedgerMgmt()
l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")
collConf := []*collConf{{name: "coll1", btl: 0}, {name: "coll2", btl: 1}}

// deploy cc1 with 'collConf'
Expand Down Expand Up @@ -192,7 +192,7 @@ func TestResetLedgerWithoutDroppingDBs(t *testing.T) {
dataHelper := newSampleDataHelper(t)

// create ledgers and pouplate with sample data
l := env.createTestLedger("ledger-1")
l := env.createTestLedgerFromGenesisBlk("ledger-1")
dataHelper.populateLedger(l)
dataHelper.verifyLedgerContent(l)
env.closeLedgerMgmt()
Expand Down
4 changes: 2 additions & 2 deletions core/ledger/kvledger/tests/rollback_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func TestRollbackKVLedger(t *testing.T) {
// populate ledgers with sample data
dataHelper := newSampleDataHelper(t)

l := env.createTestLedger("testLedger")
l := env.createTestLedgerFromGenesisBlk("testLedger")
// populate creates 8 blocks
dataHelper.populateLedger(l)
dataHelper.verifyLedgerContent(l)
Expand Down Expand Up @@ -69,7 +69,7 @@ func TestRollbackKVLedgerWithBTL(t *testing.T) {
env := newEnv(t)
defer env.cleanup()
env.initLedgerMgmt()
l := env.createTestLedger("ledger1")
l := env.createTestLedgerFromGenesisBlk("ledger1")
collConf := []*collConf{{name: "coll1", btl: 0}, {name: "coll2", btl: 1}}

// deploy cc1 with 'collConf'
Expand Down
Loading

0 comments on commit 4f1e093

Please sign in to comment.