github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/rwset_backward_compatibility_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 "fmt" 11 "io/ioutil" 12 "testing" 13 14 "github.com/hechain20/hechain/common/ledger/testutil" 15 "github.com/hechain20/hechain/common/util" 16 lgr "github.com/hechain20/hechain/core/ledger" 17 "github.com/hechain20/hechain/core/ledger/mock" 18 "github.com/hechain20/hechain/protoutil" 19 "github.com/hyperledger/fabric-protos-go/common" 20 "github.com/stretchr/testify/require" 21 ) 22 23 // TestBackwardCompatibilityRWSetV21 is added to protect against any changes in the hash function 24 // that is used in preparing the rwset that includes a merkle tree for the range query 25 func TestBackwardCompatibilityRWSetV21(t *testing.T) { 26 rwsetBytes, err := ioutil.ReadFile("testdata/rwsetbytes_v21") 27 require.NoError(t, err) 28 b := testGenerateSampleRWSet(t) 29 require.Equal(t, rwsetBytes, b) 30 } 31 32 // TestGenerateSampleRWSet generates the rwset that includes a merkle tree for a range-query read-set as well 33 // The data present in the file testdata/rwsetbytes_v21 is generated by running the below test code on version 2.1 34 // To regenrate the data, (if needed in order to add some more data to the generated rwset), checkout release-2.1, 35 // and uncomment and run the following test 36 // func TestGenerateSampleRWSet(t *testing.T) { 37 // b := testGenerateSampleRWSet(t) 38 // require.NoError(t, ioutil.WriteFile("testdata/rwsetbytes_v21", b, 0644)) 39 // } 40 41 func testGenerateSampleRWSet(t *testing.T) []byte { 42 conf, cleanup := testConfig(t) 43 defer cleanup() 44 provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{}) 45 defer provider.Close() 46 47 bg, gb := testutil.NewBlockGenerator(t, "testLedger", false) 48 gbHash := protoutil.BlockHeaderHash(gb.Header) 49 ledger, err := provider.CreateFromGenesisBlock(gb) 50 require.NoError(t, err) 51 defer ledger.Close() 52 53 bcInfo, err := ledger.GetBlockchainInfo() 54 require.NoError(t, err) 55 require.Equal(t, &common.BlockchainInfo{ 56 Height: 1, CurrentBlockHash: gbHash, PreviousBlockHash: nil, 57 }, bcInfo) 58 59 txid := util.GenerateUUID() 60 61 // perform a range query for significant larger scan so that the merkle tree building kicks in 62 // each level contains max 50 nodes per the current configuration 63 simulator, err := ledger.NewTxSimulator(txid) 64 require.NoError(t, err) 65 for i := 0; i < 10011; i++ { 66 require.NoError(t, simulator.SetState("ns1", fmt.Sprintf("key-%000d", i), []byte(fmt.Sprintf("value-%000d", i)))) 67 } 68 simulator.Done() 69 simRes, err := simulator.GetTxSimulationResults() 70 require.NoError(t, err) 71 pubSimBytes, err := simRes.GetPubSimulationBytes() 72 require.NoError(t, err) 73 block1 := bg.NextBlock([][]byte{pubSimBytes}) 74 require.NoError(t, ledger.CommitLegacy(&lgr.BlockAndPvtData{Block: block1}, &lgr.CommitOptions{})) 75 76 simulator, err = ledger.NewTxSimulator(txid) 77 require.NoError(t, err) 78 _, err = simulator.GetState("ns1", fmt.Sprintf("key-%000d", 5)) 79 require.NoError(t, err) 80 require.NoError(t, simulator.SetState("ns1", fmt.Sprintf("key-%000d", 6), []byte(fmt.Sprintf("value-%000d-new", 6)))) 81 itr, err := simulator.GetStateRangeScanIterator("ns1", "", "") 82 require.NoError(t, err) 83 numKVs := 0 84 for { 85 kv, err := itr.Next() 86 require.NoError(t, err) 87 if kv == nil { 88 break 89 } 90 numKVs++ 91 } 92 require.Equal(t, 10011, numKVs) 93 simulator.Done() 94 simRes, err = simulator.GetTxSimulationResults() 95 require.NoError(t, err) 96 pubSimBytes, err = simRes.GetPubSimulationBytes() 97 require.NoError(t, err) 98 return pubSimBytes 99 }