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  }