Files
evm/core/state_manager_test.go

103 lines
3.2 KiB
Go

// (c) 2020-2020, Lux Industries, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package core
import (
"math/big"
"testing"
"github.com/luxfi/evm/core/types"
"github.com/luxfi/geth/common"
"github.com/stretchr/testify/assert"
)
type MockTrieDB struct {
LastDereference common.Hash
LastCommit common.Hash
}
func (t *MockTrieDB) Dereference(root common.Hash) error {
t.LastDereference = root
return nil
}
func (t *MockTrieDB) Commit(root common.Hash, report bool) error {
t.LastCommit = root
return nil
}
func (t *MockTrieDB) Size() (common.StorageSize, common.StorageSize, common.StorageSize) {
return 0, 0, 0
}
func (t *MockTrieDB) Cap(limit common.StorageSize) error {
return nil
}
func TestCappedMemoryTrieWriter(t *testing.T) {
m := &MockTrieDB{}
cacheConfig := &CacheConfig{Pruning: true, CommitInterval: 4096}
w := NewTrieWriter(m, cacheConfig)
assert := assert.New(t)
for i := 0; i < int(cacheConfig.CommitInterval)+1; i++ {
bigI := big.NewInt(int64(i))
block := types.NewBlock(
&types.Header{
Root: common.BigToHash(bigI),
Number: bigI,
},
nil, nil, nil, nil,
)
assert.NoError(w.InsertTrie(block))
assert.Equal(common.Hash{}, m.LastDereference, "should not have dereferenced block on insert")
assert.Equal(common.Hash{}, m.LastCommit, "should not have committed block on insert")
w.AcceptTrie(block)
if i <= TipBufferSize {
assert.Equal(common.Hash{}, m.LastDereference, "should not have dereferenced block on accept")
} else {
assert.Equal(common.BigToHash(big.NewInt(int64(i-TipBufferSize))), m.LastDereference, "should have dereferenced old block on last accept")
m.LastDereference = common.Hash{}
}
if i < int(cacheConfig.CommitInterval) {
assert.Equal(common.Hash{}, m.LastCommit, "should not have committed block on accept")
} else {
assert.Equal(block.Root(), m.LastCommit, "should have committed block after CommitInterval")
m.LastCommit = common.Hash{}
}
w.RejectTrie(block)
assert.Equal(block.Root(), m.LastDereference, "should have dereferenced block on reject")
assert.Equal(common.Hash{}, m.LastCommit, "should not have committed block on reject")
m.LastDereference = common.Hash{}
}
}
func TestNoPruningTrieWriter(t *testing.T) {
m := &MockTrieDB{}
w := NewTrieWriter(m, &CacheConfig{})
assert := assert.New(t)
for i := 0; i < TipBufferSize+1; i++ {
bigI := big.NewInt(int64(i))
block := types.NewBlock(
&types.Header{
Root: common.BigToHash(bigI),
Number: bigI,
},
nil, nil, nil, nil,
)
assert.NoError(w.InsertTrie(block))
assert.Equal(common.Hash{}, m.LastDereference, "should not have dereferenced block on insert")
assert.Equal(common.Hash{}, m.LastCommit, "should not have committed block on insert")
w.AcceptTrie(block)
assert.Equal(common.Hash{}, m.LastDereference, "should not have dereferenced block on accept")
assert.Equal(block.Root(), m.LastCommit, "should have committed block on accept")
m.LastCommit = common.Hash{}
w.RejectTrie(block)
assert.Equal(block.Root(), m.LastDereference, "should have dereferenced block on reject")
assert.Equal(common.Hash{}, m.LastCommit, "should not have committed block on reject")
m.LastDereference = common.Hash{}
}
}