github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/txmgmt/privacyenabledstate/optimization_test.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package privacyenabledstate
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/hechain20/hechain/core/ledger/internal/version"
    13  	"github.com/hechain20/hechain/core/ledger/kvledger/bookkeeping"
    14  	"github.com/hechain20/hechain/core/ledger/kvledger/txmgmt/statedb/mock"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestMetadataHintCorrectness(t *testing.T) {
    19  	bookkeepingTestEnv := bookkeeping.NewTestEnv(t)
    20  	defer bookkeepingTestEnv.Cleanup()
    21  	bookkeeper := bookkeepingTestEnv.TestProvider.GetDBHandle("ledger1", bookkeeping.MetadataPresenceIndicator)
    22  
    23  	metadataHint, err := newMetadataHint(bookkeeper)
    24  	require.NoError(t, err)
    25  	require.False(t, metadataHint.metadataEverUsedFor("ns1"))
    26  
    27  	updates := NewUpdateBatch()
    28  	updates.PubUpdates.PutValAndMetadata("ns1", "key", []byte("value"), []byte("metadata"), version.NewHeight(1, 1))
    29  	updates.PubUpdates.PutValAndMetadata("ns2", "key", []byte("value"), []byte("metadata"), version.NewHeight(1, 2))
    30  	updates.PubUpdates.PutValAndMetadata("ns3", "key", []byte("value"), nil, version.NewHeight(1, 3))
    31  	updates.HashUpdates.PutValAndMetadata("ns1_pvt", "key", "coll", []byte("value"), []byte("metadata"), version.NewHeight(1, 1))
    32  	updates.HashUpdates.PutValAndMetadata("ns2_pvt", "key", "coll", []byte("value"), []byte("metadata"), version.NewHeight(1, 3))
    33  	updates.HashUpdates.PutValAndMetadata("ns3_pvt", "key", "coll", []byte("value"), nil, version.NewHeight(1, 3))
    34  	require.NoError(t, metadataHint.setMetadataUsedFlag(updates))
    35  
    36  	t.Run("MetadataAddedInCurrentSession", func(t *testing.T) {
    37  		require.True(t, metadataHint.metadataEverUsedFor("ns1"))
    38  		require.True(t, metadataHint.metadataEverUsedFor("ns2"))
    39  		require.True(t, metadataHint.metadataEverUsedFor("ns1_pvt"))
    40  		require.True(t, metadataHint.metadataEverUsedFor("ns2_pvt"))
    41  		require.False(t, metadataHint.metadataEverUsedFor("ns3"))
    42  		require.False(t, metadataHint.metadataEverUsedFor("ns4"))
    43  	})
    44  
    45  	t.Run("MetadataFromPersistence", func(t *testing.T) {
    46  		metadataHintFromPersistence, err := newMetadataHint(bookkeeper)
    47  		require.NoError(t, err)
    48  		require.True(t, metadataHintFromPersistence.metadataEverUsedFor("ns1"))
    49  		require.True(t, metadataHintFromPersistence.metadataEverUsedFor("ns2"))
    50  		require.True(t, metadataHintFromPersistence.metadataEverUsedFor("ns1_pvt"))
    51  		require.True(t, metadataHintFromPersistence.metadataEverUsedFor("ns2_pvt"))
    52  		require.False(t, metadataHintFromPersistence.metadataEverUsedFor("ns3"))
    53  		require.False(t, metadataHintFromPersistence.metadataEverUsedFor("ns4"))
    54  	})
    55  
    56  	t.Run("MetadataIterErrorPath", func(t *testing.T) {
    57  		bookkeepingTestEnv.TestProvider.Close()
    58  		metadataHint, err := newMetadataHint(bookkeeper)
    59  		require.EqualError(t, err, "internal leveldb error while obtaining db iterator: leveldb: closed")
    60  		require.Nil(t, metadataHint)
    61  	})
    62  }
    63  
    64  func TestMetadataHintOptimizationSkippingGoingToDB(t *testing.T) {
    65  	bookkeepingTestEnv := bookkeeping.NewTestEnv(t)
    66  	defer bookkeepingTestEnv.Cleanup()
    67  	bookkeeper := bookkeepingTestEnv.TestProvider.GetDBHandle("ledger1", bookkeeping.MetadataPresenceIndicator)
    68  
    69  	mockVersionedDB := &mock.VersionedDB{}
    70  	metadatahint, err := newMetadataHint(bookkeeper)
    71  	require.NoError(t, err)
    72  	db, err := NewDB(mockVersionedDB, "testledger", metadatahint)
    73  	require.NoError(t, err)
    74  	updates := NewUpdateBatch()
    75  	updates.PubUpdates.PutValAndMetadata("ns1", "key", []byte("value"), []byte("metadata"), version.NewHeight(1, 1))
    76  	updates.PubUpdates.PutValAndMetadata("ns2", "key", []byte("value"), nil, version.NewHeight(1, 2))
    77  	require.NoError(t, db.ApplyPrivacyAwareUpdates(updates, version.NewHeight(1, 3)))
    78  
    79  	_, err = db.GetStateMetadata("ns1", "randomkey")
    80  	require.NoError(t, err)
    81  	require.Equal(t, 1, mockVersionedDB.GetStateCallCount())
    82  	_, err = db.GetPrivateDataMetadataByHash("ns1", "randomColl", []byte("randomKeyhash"))
    83  	require.NoError(t, err)
    84  	require.Equal(t, 2, mockVersionedDB.GetStateCallCount())
    85  
    86  	_, err = db.GetStateMetadata("ns2", "randomkey")
    87  	require.NoError(t, err)
    88  	_, err = db.GetPrivateDataMetadataByHash("ns2", "randomColl", []byte("randomKeyhash"))
    89  	require.NoError(t, err)
    90  	require.Equal(t, 2, mockVersionedDB.GetStateCallCount())
    91  
    92  	_, err = db.GetStateMetadata("randomeNs", "randomkey")
    93  	require.NoError(t, err)
    94  	_, err = db.GetPrivateDataMetadataByHash("randomeNs", "randomColl", []byte("randomKeyhash"))
    95  	require.NoError(t, err)
    96  	require.Equal(t, 2, mockVersionedDB.GetStateCallCount())
    97  }