github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/txmgmt/pvtstatepurgemgmt/expiry_keeper_test.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package pvtstatepurgemgmt 8 9 import ( 10 fmt "fmt" 11 "testing" 12 13 "github.com/davecgh/go-spew/spew" 14 "github.com/golang/protobuf/proto" 15 "github.com/hechain20/hechain/core/ledger/kvledger/bookkeeping" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestExpiryKVEncoding(t *testing.T) { 20 pvtdataKeys := newPvtdataKeys() 21 pvtdataKeys.add("ns1", "coll-1", "key-1", []byte("key-1-hash")) 22 expiryInfo := &expiryInfo{&expiryInfoKey{expiryBlk: 10, committingBlk: 2}, pvtdataKeys} 23 t.Logf("expiryInfo:%s", spew.Sdump(expiryInfo)) 24 k, v, err := encodeKV(expiryInfo) 25 require.NoError(t, err) 26 expiryInfo1, err := decodeExpiryInfo(k, v) 27 require.NoError(t, err) 28 require.Equal(t, expiryInfo.expiryInfoKey, expiryInfo1.expiryInfoKey) 29 require.True(t, proto.Equal(expiryInfo.pvtdataKeys, expiryInfo1.pvtdataKeys), "proto messages are not equal") 30 } 31 32 func TestExpiryKeeper(t *testing.T) { 33 testenv := bookkeeping.NewTestEnv(t) 34 defer testenv.Cleanup() 35 expiryKeeper := newExpiryKeeper("testledger", testenv.TestProvider) 36 37 expinfo1 := &expiryInfo{&expiryInfoKey{committingBlk: 3, expiryBlk: 13}, buildPvtdataKeysForTest(1, 1)} 38 expinfo2 := &expiryInfo{&expiryInfoKey{committingBlk: 3, expiryBlk: 15}, buildPvtdataKeysForTest(2, 2)} 39 expinfo3 := &expiryInfo{&expiryInfoKey{committingBlk: 4, expiryBlk: 13}, buildPvtdataKeysForTest(3, 3)} 40 expinfo4 := &expiryInfo{&expiryInfoKey{committingBlk: 5, expiryBlk: 17}, buildPvtdataKeysForTest(4, 4)} 41 42 // Insert entries for keys at committingBlk 3 43 require.NoError(t, expiryKeeper.update([]*expiryInfo{expinfo1, expinfo2}, nil)) 44 // Insert entries for keys at committingBlk 4 and 5 45 require.NoError(t, expiryKeeper.update([]*expiryInfo{expinfo3, expinfo4}, nil)) 46 47 // Retrieve entries by expiring block 13, 15, and 17 48 listExpinfo1, _ := expiryKeeper.retrieve(13) 49 require.Len(t, listExpinfo1, 2) 50 require.Equal(t, expinfo1.expiryInfoKey, listExpinfo1[0].expiryInfoKey) 51 require.True(t, proto.Equal(expinfo1.pvtdataKeys, listExpinfo1[0].pvtdataKeys)) 52 require.Equal(t, expinfo3.expiryInfoKey, listExpinfo1[1].expiryInfoKey) 53 require.True(t, proto.Equal(expinfo3.pvtdataKeys, listExpinfo1[1].pvtdataKeys)) 54 55 listExpinfo2, _ := expiryKeeper.retrieve(15) 56 require.Len(t, listExpinfo2, 1) 57 require.Equal(t, expinfo2.expiryInfoKey, listExpinfo2[0].expiryInfoKey) 58 require.True(t, proto.Equal(expinfo2.pvtdataKeys, listExpinfo2[0].pvtdataKeys)) 59 60 listExpinfo3, _ := expiryKeeper.retrieve(17) 61 require.Len(t, listExpinfo3, 1) 62 require.Equal(t, expinfo4.expiryInfoKey, listExpinfo3[0].expiryInfoKey) 63 require.True(t, proto.Equal(expinfo4.pvtdataKeys, listExpinfo3[0].pvtdataKeys)) 64 65 // Clear entries for keys expiring at block 13 and 15 and again retrieve by expiring block 13, 15, and 17 66 require.NoError(t, 67 expiryKeeper.update(nil, []*expiryInfoKey{expinfo1.expiryInfoKey, expinfo2.expiryInfoKey, expinfo3.expiryInfoKey}), 68 ) 69 listExpinfo4, _ := expiryKeeper.retrieve(13) 70 require.Nil(t, listExpinfo4) 71 72 listExpinfo5, _ := expiryKeeper.retrieve(15) 73 require.Nil(t, listExpinfo5) 74 75 listExpinfo6, _ := expiryKeeper.retrieve(17) 76 require.Len(t, listExpinfo6, 1) 77 require.Equal(t, expinfo4.expiryInfoKey, listExpinfo6[0].expiryInfoKey) 78 require.True(t, proto.Equal(expinfo4.pvtdataKeys, listExpinfo6[0].pvtdataKeys)) 79 80 t.Run("test-error-path", func(t *testing.T) { 81 testenv.TestProvider.Close() 82 expirtyInfo, err := expiryKeeper.retrieve(15) 83 require.EqualError(t, err, "internal leveldb error while obtaining db iterator: leveldb: closed") 84 require.Nil(t, expirtyInfo) 85 }) 86 } 87 88 func buildPvtdataKeysForTest(startingEntry int, numEntries int) *PvtdataKeys { 89 pvtdataKeys := newPvtdataKeys() 90 for i := startingEntry; i <= startingEntry+numEntries; i++ { 91 pvtdataKeys.add(fmt.Sprintf("ns-%d", i), fmt.Sprintf("coll-%d", i), fmt.Sprintf("key-%d", i), []byte(fmt.Sprintf("key-%d-hash", i))) 92 } 93 return pvtdataKeys 94 }