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 }