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