github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/core/mpt/trie_store_test.go (about)

     1  package mpt
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  
     7  	"github.com/nspcc-dev/neo-go/pkg/core/storage"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestTrieStore_TestTrieOperations(t *testing.T) {
    12  	source := newTestTrie(t)
    13  	backed := source.Store
    14  
    15  	st := NewTrieStore(source.root.Hash(), ModeAll, backed)
    16  
    17  	t.Run("forbidden operations", func(t *testing.T) {
    18  		require.ErrorIs(t, st.SeekGC(storage.SeekRange{}, nil), ErrForbiddenTrieStoreOperation)
    19  		_, err := st.Get([]byte{byte(storage.STTokenTransferInfo)})
    20  		require.ErrorIs(t, err, ErrForbiddenTrieStoreOperation)
    21  		require.ErrorIs(t, st.PutChangeSet(nil, nil), ErrForbiddenTrieStoreOperation)
    22  	})
    23  
    24  	t.Run("Get", func(t *testing.T) {
    25  		t.Run("good", func(t *testing.T) {
    26  			res, err := st.Get(append([]byte{byte(storage.STStorage)}, 0xAC, 0xae)) // leaf `hello`
    27  			require.NoError(t, err)
    28  			require.Equal(t, []byte("hello"), res)
    29  		})
    30  		t.Run("bad path", func(t *testing.T) {
    31  			_, err := st.Get(append([]byte{byte(storage.STStorage)}, 0xAC, 0xa0)) // bad path
    32  			require.ErrorIs(t, err, storage.ErrKeyNotFound)
    33  		})
    34  		t.Run("path to not-a-leaf", func(t *testing.T) {
    35  			_, err := st.Get(append([]byte{byte(storage.STStorage)}, 0xAC)) // path to extension
    36  			require.ErrorIs(t, err, storage.ErrKeyNotFound)
    37  		})
    38  	})
    39  
    40  	t.Run("Seek", func(t *testing.T) {
    41  		check := func(t *testing.T, backwards bool) {
    42  			var res [][]byte
    43  			st.Seek(storage.SeekRange{
    44  				Prefix:    []byte{byte(storage.STStorage)},
    45  				Start:     nil,
    46  				Backwards: backwards,
    47  			}, func(k, v []byte) bool {
    48  				res = append(res, k)
    49  				return true
    50  			})
    51  			require.Equal(t, 4, len(res))
    52  			for i := 0; i < len(res); i++ {
    53  				require.Equal(t, byte(storage.STStorage), res[i][0])
    54  				if i < len(res)-1 {
    55  					cmp := bytes.Compare(res[i], res[i+1])
    56  					if backwards {
    57  						require.True(t, cmp > 0)
    58  					} else {
    59  						require.True(t, cmp < 0)
    60  					}
    61  				}
    62  			}
    63  		}
    64  		t.Run("good: over whole storage", func(t *testing.T) {
    65  			t.Run("forwards", func(t *testing.T) {
    66  				check(t, false)
    67  			})
    68  			t.Run("backwards", func(t *testing.T) {
    69  				check(t, true)
    70  			})
    71  		})
    72  	})
    73  }