Added chain
tests & minor fixes
* Fork tests (equal and larger chains) * `chain.link` fields are now exported * moved debug function from state to dump.go
This commit is contained in:
parent
437d79f094
commit
14e2e488fd
@ -191,8 +191,8 @@ func (self *ChainManager) GetBlock(hash []byte) *types.Block {
|
||||
if self.workingChain != nil {
|
||||
// Check the temp chain
|
||||
for e := self.workingChain.Front(); e != nil; e = e.Next() {
|
||||
if bytes.Compare(e.Value.(*link).block.Hash(), hash) == 0 {
|
||||
return e.Value.(*link).block
|
||||
if bytes.Compare(e.Value.(*link).Block.Hash(), hash) == 0 {
|
||||
return e.Value.(*link).Block
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -275,15 +275,15 @@ func (self *ChainManager) InsertChain(chain *BlockChain, call func(*types.Block,
|
||||
for e := chain.Front(); e != nil; e = e.Next() {
|
||||
link := e.Value.(*link)
|
||||
|
||||
self.add(link.block)
|
||||
self.SetTotalDifficulty(link.td)
|
||||
self.add(link.Block)
|
||||
self.SetTotalDifficulty(link.Td)
|
||||
|
||||
call(link.block, link.messages)
|
||||
call(link.Block, link.Messages)
|
||||
}
|
||||
|
||||
b, e := chain.Front(), chain.Back()
|
||||
if b != nil && e != nil {
|
||||
front, back := b.Value.(*link).block, e.Value.(*link).block
|
||||
front, back := b.Value.(*link).Block, e.Value.(*link).Block
|
||||
chainlogger.Infof("Imported %d blocks. #%v (%x) / %#v (%x)", chain.Len(), front.Number, front.Hash()[0:4], back.Number, back.Hash()[0:4])
|
||||
}
|
||||
}
|
||||
@ -295,7 +295,7 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
|
||||
for e := chain.Front(); e != nil; e = e.Next() {
|
||||
var (
|
||||
l = e.Value.(*link)
|
||||
block = l.block
|
||||
block = l.Block
|
||||
parent = self.GetBlock(block.PrevHash)
|
||||
)
|
||||
|
||||
@ -314,8 +314,8 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
|
||||
err = fmt.Errorf("incoming chain failed %v\n", err)
|
||||
return
|
||||
}
|
||||
l.td = td
|
||||
l.messages = messages
|
||||
l.Td = td
|
||||
l.Messages = messages
|
||||
}
|
||||
|
||||
if td.Cmp(self.TD) <= 0 {
|
||||
@ -329,9 +329,9 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
|
||||
}
|
||||
|
||||
type link struct {
|
||||
block *types.Block
|
||||
messages state.Messages
|
||||
td *big.Int
|
||||
Block *types.Block
|
||||
Messages state.Messages
|
||||
Td *big.Int
|
||||
}
|
||||
|
||||
type BlockChain struct {
|
||||
@ -351,7 +351,7 @@ func NewChain(blocks types.Blocks) *BlockChain {
|
||||
func (self *BlockChain) RlpEncode() []byte {
|
||||
dat := make([]interface{}, 0)
|
||||
for e := self.Front(); e != nil; e = e.Next() {
|
||||
dat = append(dat, e.Value.(*link).block.RlpData())
|
||||
dat = append(dat, e.Value.(*link).Block.RlpData())
|
||||
}
|
||||
|
||||
return ethutil.Encode(dat)
|
||||
|
@ -1 +1,116 @@
|
||||
package chain
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/ethereum/go-ethereum/chain/types"
|
||||
"github.com/ethereum/go-ethereum/ethdb"
|
||||
"github.com/ethereum/go-ethereum/ethutil"
|
||||
"github.com/ethereum/go-ethereum/state"
|
||||
)
|
||||
|
||||
var TD *big.Int
|
||||
|
||||
func init() {
|
||||
ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "")
|
||||
ethutil.Config.Db, _ = ethdb.NewMemDatabase()
|
||||
}
|
||||
|
||||
type fakeproc struct {
|
||||
}
|
||||
|
||||
func (self fakeproc) ProcessWithParent(a, b *types.Block) (*big.Int, state.Messages, error) {
|
||||
TD = new(big.Int).Add(TD, big.NewInt(1))
|
||||
return TD, nil, nil
|
||||
}
|
||||
|
||||
func makechain(cman *ChainManager, max int) *BlockChain {
|
||||
blocks := make(types.Blocks, max)
|
||||
for i := 0; i < max; i++ {
|
||||
addr := ethutil.LeftPadBytes([]byte{byte(i)}, 20)
|
||||
block := cman.NewBlock(addr)
|
||||
if i != 0 {
|
||||
cman.CurrentBlock = blocks[i-1]
|
||||
}
|
||||
blocks[i] = block
|
||||
}
|
||||
return NewChain(blocks)
|
||||
}
|
||||
|
||||
func TestLongerFork(t *testing.T) {
|
||||
cman := NewChainManager()
|
||||
cman.SetProcessor(fakeproc{})
|
||||
|
||||
TD = big.NewInt(1)
|
||||
chainA := makechain(cman, 5)
|
||||
|
||||
TD = big.NewInt(1)
|
||||
chainB := makechain(cman, 10)
|
||||
|
||||
td, err := cman.TestChain(chainA)
|
||||
if err != nil {
|
||||
t.Error("unable to create new TD from chainA:", err)
|
||||
}
|
||||
cman.TD = td
|
||||
|
||||
_, err = cman.TestChain(chainB)
|
||||
if err != nil {
|
||||
t.Error("expected chainB not to give errors:", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEqualFork(t *testing.T) {
|
||||
cman := NewChainManager()
|
||||
cman.SetProcessor(fakeproc{})
|
||||
|
||||
TD = big.NewInt(1)
|
||||
chainA := makechain(cman, 5)
|
||||
|
||||
TD = big.NewInt(2)
|
||||
chainB := makechain(cman, 5)
|
||||
|
||||
td, err := cman.TestChain(chainA)
|
||||
if err != nil {
|
||||
t.Error("unable to create new TD from chainA:", err)
|
||||
}
|
||||
cman.TD = td
|
||||
|
||||
_, err = cman.TestChain(chainB)
|
||||
if err != nil {
|
||||
t.Error("expected chainB not to give errors:", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBrokenChain(t *testing.T) {
|
||||
cman := NewChainManager()
|
||||
cman.SetProcessor(fakeproc{})
|
||||
|
||||
TD = big.NewInt(1)
|
||||
chain := makechain(cman, 5)
|
||||
chain.Remove(chain.Front())
|
||||
|
||||
_, err := cman.TestChain(chain)
|
||||
if err == nil {
|
||||
t.Error("expected broken chain to return error")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkChainTesting(b *testing.B) {
|
||||
const chainlen = 1000
|
||||
|
||||
ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "")
|
||||
ethutil.Config.Db, _ = ethdb.NewMemDatabase()
|
||||
|
||||
cman := NewChainManager()
|
||||
cman.SetProcessor(fakeproc{})
|
||||
|
||||
TD = big.NewInt(1)
|
||||
chain := makechain(cman, chainlen)
|
||||
|
||||
stime := time.Now()
|
||||
cman.TestChain(chain)
|
||||
fmt.Println(chainlen, "took", time.Since(stime))
|
||||
}
|
||||
|
@ -1,40 +0,0 @@
|
||||
mode: count
|
||||
github.com/ethereum/go-ethereum/event/event.go:41.66,45.17 4 1005
|
||||
github.com/ethereum/go-ethereum/event/event.go:63.2,63.12 1 1004
|
||||
github.com/ethereum/go-ethereum/event/event.go:45.17,47.3 1 1
|
||||
github.com/ethereum/go-ethereum/event/event.go:47.3,48.22 1 1004
|
||||
github.com/ethereum/go-ethereum/event/event.go:51.3,51.27 1 1004
|
||||
github.com/ethereum/go-ethereum/event/event.go:48.22,50.4 1 5
|
||||
github.com/ethereum/go-ethereum/event/event.go:51.27,54.32 3 1006
|
||||
github.com/ethereum/go-ethereum/event/event.go:57.4,60.25 4 1005
|
||||
github.com/ethereum/go-ethereum/event/event.go:54.32,56.5 1 1
|
||||
github.com/ethereum/go-ethereum/event/event.go:68.48,71.17 3 3513
|
||||
github.com/ethereum/go-ethereum/event/event.go:75.2,77.27 3 3511
|
||||
github.com/ethereum/go-ethereum/event/event.go:80.2,80.12 1 3509
|
||||
github.com/ethereum/go-ethereum/event/event.go:71.17,74.3 2 2
|
||||
github.com/ethereum/go-ethereum/event/event.go:77.27,79.3 1 2576
|
||||
github.com/ethereum/go-ethereum/event/event.go:86.28,88.32 2 5
|
||||
github.com/ethereum/go-ethereum/event/event.go:93.2,95.20 3 5
|
||||
github.com/ethereum/go-ethereum/event/event.go:88.32,89.28 1 3
|
||||
github.com/ethereum/go-ethereum/event/event.go:89.28,91.4 1 3
|
||||
github.com/ethereum/go-ethereum/event/event.go:98.36,100.34 2 1001
|
||||
github.com/ethereum/go-ethereum/event/event.go:109.2,109.22 1 1001
|
||||
github.com/ethereum/go-ethereum/event/event.go:100.34,101.37 1 1001
|
||||
github.com/ethereum/go-ethereum/event/event.go:101.37,102.22 1 1001
|
||||
github.com/ethereum/go-ethereum/event/event.go:102.22,104.5 1 2
|
||||
github.com/ethereum/go-ethereum/event/event.go:104.5,106.5 1 999
|
||||
github.com/ethereum/go-ethereum/event/event.go:112.46,113.26 1 2007
|
||||
github.com/ethereum/go-ethereum/event/event.go:118.2,118.11 1 1005
|
||||
github.com/ethereum/go-ethereum/event/event.go:113.26,114.16 1 181499
|
||||
github.com/ethereum/go-ethereum/event/event.go:114.16,116.4 1 1002
|
||||
github.com/ethereum/go-ethereum/event/event.go:121.52,126.2 4 999
|
||||
github.com/ethereum/go-ethereum/event/event.go:142.35,150.2 2 1005
|
||||
github.com/ethereum/go-ethereum/event/event.go:152.44,154.2 1 1003
|
||||
github.com/ethereum/go-ethereum/event/event.go:156.32,159.2 2 1001
|
||||
github.com/ethereum/go-ethereum/event/event.go:161.30,164.14 3 1004
|
||||
github.com/ethereum/go-ethereum/event/event.go:167.2,173.19 6 1003
|
||||
github.com/ethereum/go-ethereum/event/event.go:164.14,166.3 1 1
|
||||
github.com/ethereum/go-ethereum/event/event.go:176.42,178.9 2 2575
|
||||
github.com/ethereum/go-ethereum/event/event.go:182.2,182.20 1 2575
|
||||
github.com/ethereum/go-ethereum/event/event.go:179.2,179.21 0 1004
|
||||
github.com/ethereum/go-ethereum/event/event.go:180.2,180.19 0 1571
|
3294
profile.cov
3294
profile.cov
File diff suppressed because it is too large
Load Diff
@ -46,3 +46,11 @@ func (self *State) Dump() []byte {
|
||||
|
||||
return json
|
||||
}
|
||||
|
||||
// Debug stuff
|
||||
func (self *StateObject) CreateOutputForDiff() {
|
||||
fmt.Printf("%x %x %x %x\n", self.Address(), self.State.Root(), self.balance.Bytes(), self.Nonce)
|
||||
self.EachStorage(func(addr string, value *ethutil.Value) {
|
||||
fmt.Printf("%x %x\n", addr, value.Bytes())
|
||||
})
|
||||
}
|
||||
|
@ -287,14 +287,6 @@ func (self *StateObject) Root() []byte {
|
||||
return self.State.Trie.GetRoot()
|
||||
}
|
||||
|
||||
// Debug stuff
|
||||
func (self *StateObject) CreateOutputForDiff() {
|
||||
fmt.Printf("%x %x %x %x\n", self.Address(), self.State.Root(), self.balance.Bytes(), self.Nonce)
|
||||
self.EachStorage(func(addr string, value *ethutil.Value) {
|
||||
fmt.Printf("%x %x\n", addr, value.Bytes())
|
||||
})
|
||||
}
|
||||
|
||||
//
|
||||
// Encoding
|
||||
//
|
||||
|
Loading…
Reference in New Issue
Block a user