github.com/ewagmig/fabric@v2.1.1+incompatible/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/hyperledger/fabric/core/ledger/kvledger/bookkeeping" 16 "github.com/stretchr/testify/assert" 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 assert.NoError(t, err) 26 expiryInfo1, err := decodeExpiryInfo(k, v) 27 assert.NoError(t, err) 28 assert.Equal(t, expiryInfo.expiryInfoKey, expiryInfo1.expiryInfoKey) 29 assert.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 expiryKeeper.updateBookkeeping([]*expiryInfo{expinfo1, expinfo2}, nil) 44 // Insert entries for keys at committingBlk 4 and 5 45 expiryKeeper.updateBookkeeping([]*expiryInfo{expinfo3, expinfo4}, nil) 46 47 // Retrieve entries by expiring block 13, 15, and 17 48 listExpinfo1, _ := expiryKeeper.retrieve(13) 49 assert.Len(t, listExpinfo1, 2) 50 assert.Equal(t, expinfo1.expiryInfoKey, listExpinfo1[0].expiryInfoKey) 51 assert.True(t, proto.Equal(expinfo1.pvtdataKeys, listExpinfo1[0].pvtdataKeys)) 52 assert.Equal(t, expinfo3.expiryInfoKey, listExpinfo1[1].expiryInfoKey) 53 assert.True(t, proto.Equal(expinfo3.pvtdataKeys, listExpinfo1[1].pvtdataKeys)) 54 55 listExpinfo2, _ := expiryKeeper.retrieve(15) 56 assert.Len(t, listExpinfo2, 1) 57 assert.Equal(t, expinfo2.expiryInfoKey, listExpinfo2[0].expiryInfoKey) 58 assert.True(t, proto.Equal(expinfo2.pvtdataKeys, listExpinfo2[0].pvtdataKeys)) 59 60 listExpinfo3, _ := expiryKeeper.retrieve(17) 61 assert.Len(t, listExpinfo3, 1) 62 assert.Equal(t, expinfo4.expiryInfoKey, listExpinfo3[0].expiryInfoKey) 63 assert.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 expiryKeeper.updateBookkeeping(nil, []*expiryInfoKey{expinfo1.expiryInfoKey, expinfo2.expiryInfoKey, expinfo3.expiryInfoKey}) 67 listExpinfo4, _ := expiryKeeper.retrieve(13) 68 assert.Nil(t, listExpinfo4) 69 70 listExpinfo5, _ := expiryKeeper.retrieve(15) 71 assert.Nil(t, listExpinfo5) 72 73 listExpinfo6, _ := expiryKeeper.retrieve(17) 74 assert.Len(t, listExpinfo6, 1) 75 assert.Equal(t, expinfo4.expiryInfoKey, listExpinfo6[0].expiryInfoKey) 76 assert.True(t, proto.Equal(expinfo4.pvtdataKeys, listExpinfo6[0].pvtdataKeys)) 77 } 78 79 func buildPvtdataKeysForTest(startingEntry int, numEntries int) *PvtdataKeys { 80 pvtdataKeys := newPvtdataKeys() 81 for i := startingEntry; i <= startingEntry+numEntries; i++ { 82 pvtdataKeys.add(fmt.Sprintf("ns-%d", i), fmt.Sprintf("coll-%d", i), fmt.Sprintf("key-%d", i), []byte(fmt.Sprintf("key-%d-hash", i))) 83 } 84 return pvtdataKeys 85 }