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  }