forked from TrueCloudLab/neoneo-go
73 lines
2 KiB
Go
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)
|
|
})
|
|
})
|
|
})
|
|
}
|