github.com/Finschia/finschia-sdk@v0.48.1/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/tendermint/tm-db"
    12  
    13  	"github.com/Finschia/finschia-sdk/store/dbadapter"
    14  	"github.com/Finschia/finschia-sdk/store/prefix"
    15  	"github.com/Finschia/finschia-sdk/store/tracekv"
    16  	"github.com/Finschia/finschia-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  	dbm := dbadapter.Store{DB: dbm.NewMemDB()}
    42  	tc := types.TraceContext(map[string]interface{}{"blockHeight": 64})
    43  
    44  	return tracekv.NewStore(dbm, 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:           kvPairs[0].Key,
    55  			expectedValue: kvPairs[0].Value,
    56  			expectedOut:   "{\"operation\":\"read\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n",
    57  		},
    58  		{
    59  			key:           []byte("does-not-exist"),
    60  			expectedValue: nil,
    61  			expectedOut:   "{\"operation\":\"read\",\"key\":\"ZG9lcy1ub3QtZXhpc3Q=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
    62  		},
    63  	}
    64  
    65  	for _, tc := range testCases {
    66  		var buf bytes.Buffer
    67  
    68  		store := newTraceKVStore(&buf)
    69  		buf.Reset()
    70  		value := store.Get(tc.key)
    71  
    72  		require.Equal(t, tc.expectedValue, value)
    73  		require.Equal(t, tc.expectedOut, buf.String())
    74  	}
    75  }
    76  
    77  func TestTraceKVStoreSet(t *testing.T) {
    78  	testCases := []struct {
    79  		key         []byte
    80  		value       []byte
    81  		expectedOut string
    82  	}{
    83  		{
    84  			key:         kvPairs[0].Key,
    85  			value:       kvPairs[0].Value,
    86  			expectedOut: "{\"operation\":\"write\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n",
    87  		},
    88  		{
    89  			key:         kvPairs[1].Key,
    90  			value:       kvPairs[1].Value,
    91  			expectedOut: "{\"operation\":\"write\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n",
    92  		},
    93  		{
    94  			key:         kvPairs[2].Key,
    95  			value:       kvPairs[2].Value,
    96  			expectedOut: "{\"operation\":\"write\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"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  	var buf bytes.Buffer
   111  	store := newEmptyTraceKVStore(&buf)
   112  	require.Panics(t, func() { store.Set([]byte(""), []byte("value")) }, "setting an empty key should panic")
   113  	require.Panics(t, func() { store.Set(nil, []byte("value")) }, "setting a nil key should panic")
   114  }
   115  
   116  func TestTraceKVStoreDelete(t *testing.T) {
   117  	testCases := []struct {
   118  		key         []byte
   119  		expectedOut string
   120  	}{
   121  		{
   122  			key:         kvPairs[0].Key,
   123  			expectedOut: "{\"operation\":\"delete\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   124  		},
   125  	}
   126  
   127  	for _, tc := range testCases {
   128  		var buf bytes.Buffer
   129  
   130  		store := newTraceKVStore(&buf)
   131  		buf.Reset()
   132  		store.Delete(tc.key)
   133  
   134  		require.Equal(t, tc.expectedOut, buf.String())
   135  	}
   136  }
   137  
   138  func TestTraceKVStoreHas(t *testing.T) {
   139  	testCases := []struct {
   140  		key      []byte
   141  		expected bool
   142  	}{
   143  		{
   144  			key:      kvPairs[0].Key,
   145  			expected: true,
   146  		},
   147  	}
   148  
   149  	for _, tc := range testCases {
   150  		var buf bytes.Buffer
   151  
   152  		store := newTraceKVStore(&buf)
   153  		buf.Reset()
   154  		ok := store.Has(tc.key)
   155  
   156  		require.Equal(t, tc.expected, ok)
   157  	}
   158  }
   159  
   160  func TestTestTraceKVStoreIterator(t *testing.T) {
   161  	var buf bytes.Buffer
   162  
   163  	store := newTraceKVStore(&buf)
   164  	iterator := store.Iterator(nil, nil)
   165  
   166  	s, e := iterator.Domain()
   167  	require.Equal(t, []byte(nil), s)
   168  	require.Equal(t, []byte(nil), e)
   169  
   170  	testCases := []struct {
   171  		expectedKey      []byte
   172  		expectedValue    []byte
   173  		expectedKeyOut   string
   174  		expectedvalueOut string
   175  	}{
   176  		{
   177  			expectedKey:      kvPairs[0].Key,
   178  			expectedValue:    kvPairs[0].Value,
   179  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   180  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n",
   181  		},
   182  		{
   183  			expectedKey:      kvPairs[1].Key,
   184  			expectedValue:    kvPairs[1].Value,
   185  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   186  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n",
   187  		},
   188  		{
   189  			expectedKey:      kvPairs[2].Key,
   190  			expectedValue:    kvPairs[2].Value,
   191  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   192  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"metadata\":{\"blockHeight\":64}}\n",
   193  		},
   194  	}
   195  
   196  	for _, tc := range testCases {
   197  		buf.Reset()
   198  		ka := iterator.Key()
   199  		require.Equal(t, tc.expectedKeyOut, buf.String())
   200  
   201  		buf.Reset()
   202  		va := iterator.Value()
   203  		require.Equal(t, tc.expectedvalueOut, buf.String())
   204  
   205  		require.Equal(t, tc.expectedKey, ka)
   206  		require.Equal(t, tc.expectedValue, va)
   207  
   208  		iterator.Next()
   209  	}
   210  
   211  	require.False(t, iterator.Valid())
   212  	require.Panics(t, iterator.Next)
   213  	require.NoError(t, iterator.Close())
   214  }
   215  
   216  func TestTestTraceKVStoreReverseIterator(t *testing.T) {
   217  	var buf bytes.Buffer
   218  
   219  	store := newTraceKVStore(&buf)
   220  	iterator := store.ReverseIterator(nil, nil)
   221  
   222  	s, e := iterator.Domain()
   223  	require.Equal(t, []byte(nil), s)
   224  	require.Equal(t, []byte(nil), e)
   225  
   226  	testCases := []struct {
   227  		expectedKey      []byte
   228  		expectedValue    []byte
   229  		expectedKeyOut   string
   230  		expectedvalueOut string
   231  	}{
   232  		{
   233  			expectedKey:      kvPairs[2].Key,
   234  			expectedValue:    kvPairs[2].Value,
   235  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   236  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"metadata\":{\"blockHeight\":64}}\n",
   237  		},
   238  		{
   239  			expectedKey:      kvPairs[1].Key,
   240  			expectedValue:    kvPairs[1].Value,
   241  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   242  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n",
   243  		},
   244  		{
   245  			expectedKey:      kvPairs[0].Key,
   246  			expectedValue:    kvPairs[0].Value,
   247  			expectedKeyOut:   "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n",
   248  			expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n",
   249  		},
   250  	}
   251  
   252  	for _, tc := range testCases {
   253  		buf.Reset()
   254  		ka := iterator.Key()
   255  		require.Equal(t, tc.expectedKeyOut, buf.String())
   256  
   257  		buf.Reset()
   258  		va := iterator.Value()
   259  		require.Equal(t, tc.expectedvalueOut, buf.String())
   260  
   261  		require.Equal(t, tc.expectedKey, ka)
   262  		require.Equal(t, tc.expectedValue, va)
   263  
   264  		iterator.Next()
   265  	}
   266  
   267  	require.False(t, iterator.Valid())
   268  	require.Panics(t, iterator.Next)
   269  	require.NoError(t, iterator.Close())
   270  }
   271  
   272  func TestTraceKVStorePrefix(t *testing.T) {
   273  	store := newEmptyTraceKVStore(nil)
   274  	pStore := prefix.NewStore(store, []byte("trace_prefix"))
   275  	require.IsType(t, prefix.Store{}, pStore)
   276  }
   277  
   278  func TestTraceKVStoreGetStoreType(t *testing.T) {
   279  	dbm := dbadapter.Store{DB: dbm.NewMemDB()}
   280  	store := newEmptyTraceKVStore(nil)
   281  	require.Equal(t, dbm.GetStoreType(), store.GetStoreType())
   282  }
   283  
   284  func TestTraceKVStoreCacheWrap(t *testing.T) {
   285  	store := newEmptyTraceKVStore(nil)
   286  	require.Panics(t, func() { store.CacheWrap() })
   287  }
   288  
   289  func TestTraceKVStoreCacheWrapWithTrace(t *testing.T) {
   290  	store := newEmptyTraceKVStore(nil)
   291  	require.Panics(t, func() { store.CacheWrapWithTrace(nil, nil) })
   292  }
   293  
   294  func TestTraceKVStoreCacheWrapWithListeners(t *testing.T) {
   295  	store := newEmptyTraceKVStore(nil)
   296  	require.Panics(t, func() { store.CacheWrapWithListeners(nil, nil) })
   297  }