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 }