github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/store/tracekv/store_test.go (about)

     1  package tracekv_test
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    12  
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/dbadapter"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/prefix"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/tracekv"
    16  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types"
    17  )
    18  
    19  func bz(s string) []byte { return []byte(s) }
    20  
    21  func keyFmt(i int) []byte { return bz(fmt.Sprintf("key%0.8d", i)) }
    22  func valFmt(i int) []byte { return bz(fmt.Sprintf("value%0.8d", i)) }
    23  
    24  var kvPairs = []types.KVPair{
    25  	{Key: keyFmt(1), Value: valFmt(1)},
    26  	{Key: keyFmt(2), Value: valFmt(2)},
    27  	{Key: keyFmt(3), Value: valFmt(3)},
    28  }
    29  
    30  func newTraceKVStore(w io.Writer) *tracekv.Store {
    31  	store := newEmptyTraceKVStore(w)
    32  
    33  	for _, kvPair := range kvPairs {
    34  		store.Set(kvPair.Key, kvPair.Value)
    35  	}
    36  
    37  	return store
    38  }
    39  
    40  func newEmptyTraceKVStore(w io.Writer) *tracekv.Store {
    41  	memDB := dbadapter.Store{DB: dbm.NewMemDB()}
    42  	tc := types.TraceContext(map[string]interface{}{"blockHeight": 64})
    43  
    44  	return tracekv.NewStore(memDB, w, tc)
    45  }
    46  
    47  func TestTraceKVStoreGet(t *testing.T) {
    48  	testCases := []struct {
    49  		key           []byte
    50  		expectedValue []byte
    51  		expectedOut   string
    52  	}{
    53  		{
    54  			key:           []byte{},
    55  			expectedValue: nil,
    56  			expectedOut:   "{\"operation\":\"read\",\"key\":\"\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
    57  		},
    58  		{
    59  			key:           kvPairs[0].Key,
    60  			expectedValue: kvPairs[0].Value,
    61  			expectedOut:   "{\"operation\":\"read\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n",
    62  		},
    63  		{
    64  			key:           []byte("does-not-exist"),
    65  			expectedValue: nil,
    66  			expectedOut:   "{\"operation\":\"read\",\"key\":\"ZG9lcy1ub3QtZXhpc3Q=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
    67  		},
    68  	}
    69  
    70  	for _, tc := range testCases {
    71  		var buf bytes.Buffer
    72  
    73  		store := newTraceKVStore(&buf)
    74  		buf.Reset()
    75  		value := store.Get(tc.key)
    76  
    77  		require.Equal(t, tc.expectedValue, value)
    78  		require.Equal(t, tc.expectedOut, buf.String())
    79  	}
    80  }
    81  
    82  func TestTraceKVStoreSet(t *testing.T) {
    83  	testCases := []struct {
    84  		key         []byte
    85  		value       []byte
    86  		expectedOut string
    87  	}{
    88  		{
    89  			key:         []byte{},
    90  			value:       nil,
    91  			expectedOut: "{\"operation\":\"write\",\"key\":\"\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
    92  		},
    93  		{
    94  			key:         kvPairs[0].Key,
    95  			value:       kvPairs[0].Value,
    96  			expectedOut: "{\"operation\":\"write\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n",
    97  		},
    98  	}
    99  
   100  	for _, tc := range testCases {
   101  		var buf bytes.Buffer
   102  
   103  		store := newEmptyTraceKVStore(&buf)
   104  		buf.Reset()
   105  		store.Set(tc.key, tc.value)
   106  
   107  		require.Equal(t, tc.expectedOut, buf.String())
   108  	}
   109  }
   110  
   111  func TestTraceKVStoreDelete(t *testing.T) {
   112  	testCases := []struct {
   113  		key         []byte
   114  		expectedOut string
   115  	}{
   116  		{
   117  			key:         []byte{},
   118  			expectedOut: "{\"operation\":\"delete\",\"key\":\"\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   119  		},
   120  		{
   121  			key:         kvPairs[0].Key,
   122  			expectedOut: "{\"operation\":\"delete\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   123  		},
   124  	}
   125  
   126  	for _, tc := range testCases {
   127  		var buf bytes.Buffer
   128  
   129  		store := newTraceKVStore(&buf)
   130  		buf.Reset()
   131  		store.Delete(tc.key)
   132  
   133  		require.Equal(t, tc.expectedOut, buf.String())
   134  	}
   135  }
   136  
   137  func TestTraceKVStoreHas(t *testing.T) {
   138  	testCases := []struct {
   139  		key      []byte
   140  		expected bool
   141  	}{
   142  		{
   143  			key:      []byte{},
   144  			expected: false,
   145  		},
   146  		{
   147  			key:      kvPairs[0].Key,
   148  			expected: true,
   149  		},
   150  	}
   151  
   152  	for _, tc := range testCases {
   153  		var buf bytes.Buffer
   154  
   155  		store := newTraceKVStore(&buf)
   156  		buf.Reset()
   157  		ok := store.Has(tc.key)
   158  
   159  		require.Equal(t, tc.expected, ok)
   160  	}
   161  }
   162  
   163  func TestTestTraceKVStoreIterator(t *testing.T) {
   164  	var buf bytes.Buffer
   165  
   166  	store := newTraceKVStore(&buf)
   167  	iterator := store.Iterator(nil, nil)
   168  
   169  	s, e := iterator.Domain()
   170  	require.Equal(t, []byte(nil), s)
   171  	require.Equal(t, []byte(nil), e)
   172  
   173  	testCases := []struct {
   174  		expectedKey      []byte
   175  		expectedValue    []byte
   176  		expectedKeyOut   string
   177  		expectedvalueOut string
   178  	}{
   179  		{
   180  			expectedKey:      kvPairs[0].Key,
   181  			expectedValue:    kvPairs[0].Value,
   182  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   183  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n",
   184  		},
   185  		{
   186  			expectedKey:      kvPairs[1].Key,
   187  			expectedValue:    kvPairs[1].Value,
   188  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   189  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n",
   190  		},
   191  		{
   192  			expectedKey:      kvPairs[2].Key,
   193  			expectedValue:    kvPairs[2].Value,
   194  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   195  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"metadata\":{\"blockHeight\":64}}\n",
   196  		},
   197  	}
   198  
   199  	for _, tc := range testCases {
   200  		buf.Reset()
   201  		ka := iterator.Key()
   202  		require.Equal(t, tc.expectedKeyOut, buf.String())
   203  
   204  		buf.Reset()
   205  		va := iterator.Value()
   206  		require.Equal(t, tc.expectedvalueOut, buf.String())
   207  
   208  		require.Equal(t, tc.expectedKey, ka)
   209  		require.Equal(t, tc.expectedValue, va)
   210  
   211  		iterator.Next()
   212  	}
   213  
   214  	require.False(t, iterator.Valid())
   215  	require.Panics(t, iterator.Next)
   216  	require.NotPanics(t, iterator.Close)
   217  }
   218  
   219  func TestTestTraceKVStoreReverseIterator(t *testing.T) {
   220  	var buf bytes.Buffer
   221  
   222  	store := newTraceKVStore(&buf)
   223  	iterator := store.ReverseIterator(nil, nil)
   224  
   225  	s, e := iterator.Domain()
   226  	require.Equal(t, []byte(nil), s)
   227  	require.Equal(t, []byte(nil), e)
   228  
   229  	testCases := []struct {
   230  		expectedKey      []byte
   231  		expectedValue    []byte
   232  		expectedKeyOut   string
   233  		expectedvalueOut string
   234  	}{
   235  		{
   236  			expectedKey:      kvPairs[2].Key,
   237  			expectedValue:    kvPairs[2].Value,
   238  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   239  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"metadata\":{\"blockHeight\":64}}\n",
   240  		},
   241  		{
   242  			expectedKey:      kvPairs[1].Key,
   243  			expectedValue:    kvPairs[1].Value,
   244  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   245  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n",
   246  		},
   247  		{
   248  			expectedKey:      kvPairs[0].Key,
   249  			expectedValue:    kvPairs[0].Value,
   250  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   251  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n",
   252  		},
   253  	}
   254  
   255  	for _, tc := range testCases {
   256  		buf.Reset()
   257  		ka := iterator.Key()
   258  		require.Equal(t, tc.expectedKeyOut, buf.String())
   259  
   260  		buf.Reset()
   261  		va := iterator.Value()
   262  		require.Equal(t, tc.expectedvalueOut, buf.String())
   263  
   264  		require.Equal(t, tc.expectedKey, ka)
   265  		require.Equal(t, tc.expectedValue, va)
   266  
   267  		iterator.Next()
   268  	}
   269  
   270  	require.False(t, iterator.Valid())
   271  	require.Panics(t, iterator.Next)
   272  	require.NotPanics(t, iterator.Close)
   273  }
   274  
   275  func TestTraceKVStorePrefix(t *testing.T) {
   276  	store := newEmptyTraceKVStore(nil)
   277  	pStore := prefix.NewStore(store, []byte("trace_prefix"))
   278  	require.IsType(t, prefix.Store{}, pStore)
   279  }
   280  
   281  func TestTraceKVStoreGetStoreType(t *testing.T) {
   282  	memDB := dbadapter.Store{DB: dbm.NewMemDB()}
   283  	store := newEmptyTraceKVStore(nil)
   284  	require.Equal(t, memDB.GetStoreType(), store.GetStoreType())
   285  }
   286  
   287  func TestTraceKVStoreCacheWrap(t *testing.T) {
   288  	store := newEmptyTraceKVStore(nil)
   289  	require.Panics(t, func() { store.CacheWrap() })
   290  }
   291  func TestTraceKVStoreCacheWrapWithTrace(t *testing.T) {
   292  	store := newEmptyTraceKVStore(nil)
   293  	require.Panics(t, func() { store.CacheWrapWithTrace(nil, nil) })
   294  }