|
|
@@ -9,6 +9,7 @@ import (
|
|
|
"strconv"
|
|
|
"testing"
|
|
|
|
|
|
+ "github.com/ethereum/go-ethereum/common"
|
|
|
"github.com/ethereum/go-ethereum/core/state"
|
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
|
|
@@ -369,11 +370,8 @@ func makeChainWithDiff(genesis *types.Block, d []int, seed byte) []*types.Block
|
|
|
return chain
|
|
|
}
|
|
|
|
|
|
-func TestReorg(t *testing.T) {
|
|
|
- db, _ := ethdb.NewMemDatabase()
|
|
|
+func chm(genesis *types.Block, db common.Database) *ChainManager {
|
|
|
var eventMux event.TypeMux
|
|
|
-
|
|
|
- genesis := GenesisBlock(db)
|
|
|
bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: &eventMux}
|
|
|
bc.cache = NewBlockCache(100)
|
|
|
bc.futureBlocks = NewBlockCache(100)
|
|
|
@@ -381,6 +379,14 @@ func TestReorg(t *testing.T) {
|
|
|
bc.ResetWithGenesisBlock(genesis)
|
|
|
bc.txState = state.ManageState(bc.State())
|
|
|
|
|
|
+ return bc
|
|
|
+}
|
|
|
+
|
|
|
+func TestReorgLongest(t *testing.T) {
|
|
|
+ db, _ := ethdb.NewMemDatabase()
|
|
|
+ genesis := GenesisBlock(db)
|
|
|
+ bc := chm(genesis, db)
|
|
|
+
|
|
|
chain1 := makeChainWithDiff(genesis, []int{1, 2, 4}, 10)
|
|
|
chain2 := makeChainWithDiff(genesis, []int{1, 2, 3, 4}, 11)
|
|
|
|
|
|
@@ -394,3 +400,22 @@ func TestReorg(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestReorgShortest(t *testing.T) {
|
|
|
+ db, _ := ethdb.NewMemDatabase()
|
|
|
+ genesis := GenesisBlock(db)
|
|
|
+ bc := chm(genesis, db)
|
|
|
+
|
|
|
+ chain1 := makeChainWithDiff(genesis, []int{1, 2, 3, 4}, 10)
|
|
|
+ chain2 := makeChainWithDiff(genesis, []int{1, 10}, 11)
|
|
|
+
|
|
|
+ bc.InsertChain(chain1)
|
|
|
+ bc.InsertChain(chain2)
|
|
|
+
|
|
|
+ prev := bc.CurrentBlock()
|
|
|
+ for block := bc.GetBlockByNumber(bc.CurrentBlock().NumberU64() - 1); block.NumberU64() != 0; prev, block = block, bc.GetBlockByNumber(block.NumberU64()-1) {
|
|
|
+ if prev.ParentHash() != block.Hash() {
|
|
|
+ t.Errorf("parent hash mismatch %x - %x", prev.ParentHash(), block.Hash())
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|