github.com/defanghe/fabric@v2.1.1+incompatible/core/ledger/kvledger/txmgmt/txmgr/lockbasedtxmgr/helper_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package lockbasedtxmgr 8 9 import ( 10 "testing" 11 12 "github.com/hyperledger/fabric-protos-go/ledger/queryresult" 13 "github.com/hyperledger/fabric-protos-go/ledger/rwset/kvrwset" 14 "github.com/hyperledger/fabric/bccsp/sw" 15 commonledger "github.com/hyperledger/fabric/common/ledger" 16 "github.com/hyperledger/fabric/common/ledger/testutil" 17 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/privacyenabledstate" 18 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/rwsetutil" 19 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version" 20 btltestutil "github.com/hyperledger/fabric/core/ledger/pvtdatapolicy/testutil" 21 "github.com/hyperledger/fabric/core/ledger/util" 22 "github.com/stretchr/testify/assert" 23 ) 24 25 func TestPvtdataResultsItr(t *testing.T) { 26 testEnv := testEnvsMap[levelDBtestEnvName] 27 btlPolicy := btltestutil.SampleBTLPolicy( 28 map[[2]string]uint64{ 29 {"ns1", "coll1"}: 0, 30 {"ns2", "coll1"}: 0, 31 {"ns3", "coll1"}: 0, 32 }, 33 ) 34 testEnv.init(t, "test-pvtdata-range-queries", btlPolicy) 35 defer testEnv.cleanup() 36 37 txMgr := testEnv.getTxMgr().(*LockBasedTxMgr) 38 populateCollConfigForTest(t, txMgr, []collConfigkey{ 39 {"ns1", "coll1"}, {"ns2", "coll1"}, {"ns3", "coll1"}, {"ns4", "coll1"}}, 40 version.NewHeight(1, 0), 41 ) 42 43 updates := privacyenabledstate.NewUpdateBatch() 44 putPvtUpdates(t, updates, "ns1", "coll1", "key1", []byte("pvt_value1"), version.NewHeight(1, 1)) 45 putPvtUpdates(t, updates, "ns1", "coll1", "key2", []byte("pvt_value2"), version.NewHeight(1, 2)) 46 putPvtUpdates(t, updates, "ns1", "coll1", "key3", []byte("pvt_value3"), version.NewHeight(1, 3)) 47 putPvtUpdates(t, updates, "ns1", "coll1", "key4", []byte("pvt_value4"), version.NewHeight(1, 4)) 48 putPvtUpdates(t, updates, "ns2", "coll1", "key5", []byte("pvt_value5"), version.NewHeight(1, 5)) 49 putPvtUpdates(t, updates, "ns2", "coll1", "key6", []byte("pvt_value6"), version.NewHeight(1, 6)) 50 putPvtUpdates(t, updates, "ns3", "coll1", "key7", []byte("pvt_value7"), version.NewHeight(1, 7)) 51 txMgr.db.ApplyPrivacyAwareUpdates(updates, version.NewHeight(2, 7)) 52 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 53 assert.NoError(t, err) 54 queryHelper := newQueryHelper(txMgr, nil, true, cryptoProvider) 55 56 resItr, err := queryHelper.getPrivateDataRangeScanIterator("ns1", "coll1", "key1", "key3") 57 assert.NoError(t, err) 58 testItr(t, resItr, "ns1", "coll1", []string{"key1", "key2"}) 59 60 resItr, err = queryHelper.getPrivateDataRangeScanIterator("ns4", "coll1", "key1", "key3") 61 assert.NoError(t, err) 62 testItr(t, resItr, "ns4", "coll1", []string{}) 63 } 64 65 func testItr(t *testing.T, itr commonledger.ResultsIterator, expectedNs string, expectedColl string, expectedKeys []string) { 66 t.Logf("Testing itr for [%d] keys", len(expectedKeys)) 67 defer itr.Close() 68 for _, expectedKey := range expectedKeys { 69 queryResult, _ := itr.Next() 70 pvtdataKV := queryResult.(*queryresult.KV) 71 ns := pvtdataKV.Namespace 72 key := pvtdataKV.Key 73 assert.Equal(t, expectedNs, ns) 74 assert.Equal(t, expectedKey, key) 75 } 76 last, err := itr.Next() 77 assert.NoError(t, err) 78 assert.Nil(t, last) 79 } 80 81 func TestPrivateDataMetadataRetrievalByHash(t *testing.T) { 82 for _, testEnv := range testEnvs { 83 testPrivateDataMetadataRetrievalByHash(t, testEnv) 84 } 85 } 86 87 func testPrivateDataMetadataRetrievalByHash(t *testing.T, env testEnv) { 88 ledgerid := "test-privatedata-metadata-retrieval-byhash" 89 btlPolicy := btltestutil.SampleBTLPolicy( 90 map[[2]string]uint64{ 91 {"ns", "coll"}: 0, 92 }, 93 ) 94 env.init(t, ledgerid, btlPolicy) 95 defer env.cleanup() 96 97 txMgr := env.getTxMgr() 98 bg, _ := testutil.NewBlockGenerator(t, ledgerid, false) 99 populateCollConfigForTest(t, txMgr.(*LockBasedTxMgr), []collConfigkey{{"ns", "coll"}}, version.NewHeight(1, 1)) 100 // Simulate and commit tx1 - set val and metadata for key1 101 key1, value1, metadata1 := "key1", []byte("value1"), map[string][]byte{"entry1": []byte("meatadata1-entry1")} 102 s1, _ := txMgr.NewTxSimulator("test_tx1") 103 s1.SetPrivateData("ns", "coll", key1, value1) 104 s1.SetPrivateDataMetadata("ns", "coll", key1, metadata1) 105 s1.Done() 106 blkAndPvtdata1 := prepareNextBlockForTestFromSimulator(t, bg, s1) 107 _, _, err := txMgr.ValidateAndPrepare(blkAndPvtdata1, true) 108 assert.NoError(t, err) 109 assert.NoError(t, txMgr.Commit()) 110 111 t.Run("query-helper-for-queryexecutor", func(t *testing.T) { 112 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 113 assert.NoError(t, err) 114 queryHelper := newQueryHelper(txMgr.(*LockBasedTxMgr), nil, true, cryptoProvider) 115 metadataRetrieved, err := queryHelper.getPrivateDataMetadataByHash("ns", "coll", util.ComputeStringHash("key1")) 116 assert.NoError(t, err) 117 assert.Equal(t, metadata1, metadataRetrieved) 118 }) 119 120 t.Run("query-helper-for-txsimulator", func(t *testing.T) { 121 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 122 assert.NoError(t, err) 123 queryHelper := newQueryHelper(txMgr.(*LockBasedTxMgr), rwsetutil.NewRWSetBuilder(), true, cryptoProvider) 124 _, err = queryHelper.getPrivateDataMetadataByHash("ns", "coll", util.ComputeStringHash("key1")) 125 assert.EqualError(t, err, "retrieving private data metadata by keyhash is not supported in simulation. This function is only available for query as yet") 126 }) 127 } 128 129 func TestGetPvtdataHash(t *testing.T) { 130 for _, testEnv := range testEnvs { 131 testGetPvtdataHash(t, testEnv) 132 } 133 } 134 135 func testGetPvtdataHash(t *testing.T, env testEnv) { 136 ledgerid := "test-get-pvtdata-hash" 137 btlPolicy := btltestutil.SampleBTLPolicy( 138 map[[2]string]uint64{ 139 {"ns", "coll"}: 0, 140 }, 141 ) 142 env.init(t, ledgerid, btlPolicy) 143 defer env.cleanup() 144 txMgr := env.getTxMgr().(*LockBasedTxMgr) 145 populateCollConfigForTest(t, txMgr, []collConfigkey{{"ns", "coll"}}, version.NewHeight(1, 1)) 146 147 batch := privacyenabledstate.NewUpdateBatch() 148 batch.HashUpdates.Put( 149 "ns", "coll", 150 util.ComputeStringHash("existing-key"), 151 util.ComputeStringHash("existing-value"), 152 version.NewHeight(1, 1), 153 ) 154 assert.NoError(t, txMgr.db.ApplyPrivacyAwareUpdates(batch, version.NewHeight(1, 5))) 155 156 s, _ := txMgr.NewTxSimulator("test_tx1") 157 simulator := s.(*lockBasedTxSimulator) 158 hash, err := simulator.GetPrivateDataHash("ns", "coll", "non-existing-key") 159 assert.NoError(t, err) 160 assert.Nil(t, hash) 161 162 hash, err = simulator.GetPrivateDataHash("ns", "coll", "existing-key") 163 assert.NoError(t, err) 164 assert.Equal(t, util.ComputeStringHash("existing-value"), hash) 165 simulator.Done() 166 167 simRes, err := simulator.GetTxSimulationResults() 168 assert.NoError(t, err) 169 assert.False(t, simRes.ContainsPvtWrites()) 170 txrwset, _ := rwsetutil.TxRwSetFromProtoMsg(simRes.PubSimulationResults) 171 172 expectedRwSet := &rwsetutil.TxRwSet{ 173 NsRwSets: []*rwsetutil.NsRwSet{ 174 { 175 NameSpace: "ns", 176 KvRwSet: &kvrwset.KVRWSet{}, 177 CollHashedRwSets: []*rwsetutil.CollHashedRwSet{ 178 { 179 CollectionName: "coll", 180 HashedRwSet: &kvrwset.HashedRWSet{ 181 HashedReads: []*kvrwset.KVReadHash{ 182 { 183 KeyHash: util.ComputeStringHash("existing-key"), 184 Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}, 185 }, 186 { 187 KeyHash: util.ComputeStringHash("non-existing-key"), 188 Version: nil, 189 }, 190 }, 191 }, 192 }, 193 }, 194 }, 195 }, 196 } 197 assert.Equal(t, expectedRwSet, txrwset) 198 } 199 200 func putPvtUpdates(t *testing.T, updates *privacyenabledstate.UpdateBatch, ns, coll, key string, value []byte, ver *version.Height) { 201 updates.PvtUpdates.Put(ns, coll, key, value, ver) 202 updates.HashUpdates.Put(ns, coll, util.ComputeStringHash(key), util.ComputeHash(value), ver) 203 }