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  }