mirror of
https://github.com/luxfi/evm.git
synced 2026-09-24 00:27:44 +00:00
103 lines
3.2 KiB
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{}
|
|
}
|
|
}
|