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  }