neoneo-go/pkg/core/mpt/trie_store_test.go
2022-04-29 16:10:04 +03:00

73 lines
2 KiB
Go

package mpt
import (
"bytes"
"testing"
"github.com/nspcc-dev/neo-go/pkg/core/storage"
"github.com/stretchr/testify/require"
)
func TestTrieStore_TestTrieOperations(t *testing.T) {
source := newTestTrie(t)
backed := source.Store
st := NewTrieStore(source.root.Hash(), ModeAll, backed)
t.Run("forbidden operations", func(t *testing.T) {
require.ErrorIs(t, st.SeekGC(storage.SeekRange{}, nil), ErrForbiddenTrieStoreOperation)
_, err := st.Get([]byte{byte(storage.STTokenTransferInfo)})
require.ErrorIs(t, err, ErrForbiddenTrieStoreOperation)
require.ErrorIs(t, st.PutChangeSet(nil, nil), ErrForbiddenTrieStoreOperation)
})
t.Run("Get", func(t *testing.T) {
t.Run("good", func(t *testing.T) {
res, err := st.Get(append([]byte{byte(storage.STStorage)}, 0xAC, 0xae)) // leaf `hello`
require.NoError(t, err)
require.Equal(t, []byte("hello"), res)
})
t.Run("bad path", func(t *testing.T) {
_, err := st.Get(append([]byte{byte(storage.STStorage)}, 0xAC, 0xa0)) // bad path
require.ErrorIs(t, err, storage.ErrKeyNotFound)
})
t.Run("path to not-a-leaf", func(t *testing.T) {
_, err := st.Get(append([]byte{byte(storage.STStorage)}, 0xAC)) // path to extension
require.ErrorIs(t, err, storage.ErrKeyNotFound)
})
})
t.Run("Seek", func(t *testing.T) {
check := func(t *testing.T, backwards bool) {
var res [][]byte
st.Seek(storage.SeekRange{
Prefix: []byte{byte(storage.STStorage)},
Start: nil,
Backwards: backwards,
}, func(k, v []byte) bool {
res = append(res, k)
return true
})
require.Equal(t, 4, len(res))
for i := 0; i < len(res); i++ {
require.Equal(t, byte(storage.STStorage), res[i][0])
if i < len(res)-1 {
cmp := bytes.Compare(res[i], res[i+1])
if backwards {
require.True(t, cmp > 0)
} else {
require.True(t, cmp < 0)
}
}
}
}
t.Run("good: over whole storage", func(t *testing.T) {
t.Run("forwards", func(t *testing.T) {
check(t, false)
})
t.Run("backwards", func(t *testing.T) {
check(t, true)
})
})
})
}