2014-12-04 09:28:02 +00:00
|
|
|
package core
|
2014-12-17 11:57:35 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2014-12-30 12:32:01 +00:00
|
|
|
"os"
|
2014-12-17 11:57:35 +00:00
|
|
|
"path"
|
2014-12-30 12:32:01 +00:00
|
|
|
"reflect"
|
2014-12-18 12:12:54 +00:00
|
|
|
"runtime"
|
2014-12-17 11:57:35 +00:00
|
|
|
"testing"
|
|
|
|
|
2014-12-18 12:12:54 +00:00
|
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
2014-12-17 11:57:35 +00:00
|
|
|
"github.com/ethereum/go-ethereum/ethutil"
|
2014-12-18 12:12:54 +00:00
|
|
|
"github.com/ethereum/go-ethereum/event"
|
2014-12-30 12:32:01 +00:00
|
|
|
"github.com/ethereum/go-ethereum/rlp"
|
2014-12-18 12:12:54 +00:00
|
|
|
//logpkg "github.com/ethereum/go-ethereum/logger"
|
2014-12-17 11:57:35 +00:00
|
|
|
)
|
|
|
|
|
2014-12-18 12:12:54 +00:00
|
|
|
//var Logger logpkg.LogSystem
|
|
|
|
//var Log = logpkg.NewLogger("TEST")
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
|
|
|
//Logger = logpkg.NewStdLogSystem(os.Stdout, log.LstdFlags, logpkg.InfoLevel)
|
|
|
|
//logpkg.AddLogSystem(Logger)
|
|
|
|
|
|
|
|
ethutil.ReadConfig("/tmp/ethtest", "/tmp/ethtest", "ETH")
|
|
|
|
|
|
|
|
db, err := ethdb.NewMemDatabase()
|
|
|
|
if err != nil {
|
|
|
|
panic("Could not create mem-db, failing")
|
|
|
|
}
|
|
|
|
ethutil.Config.Db = db
|
|
|
|
}
|
|
|
|
|
2014-12-30 12:32:01 +00:00
|
|
|
func loadChain(fn string, t *testing.T) (types.Blocks, error) {
|
|
|
|
fh, err := os.OpenFile(path.Join("..", "_data", fn), os.O_RDONLY, os.ModePerm)
|
2014-12-17 11:57:35 +00:00
|
|
|
if err != nil {
|
2014-12-30 12:32:01 +00:00
|
|
|
return nil, err
|
2014-12-17 11:57:35 +00:00
|
|
|
}
|
2014-12-30 12:32:01 +00:00
|
|
|
defer fh.Close()
|
|
|
|
|
|
|
|
var chain types.Blocks
|
|
|
|
if err := rlp.Decode(fh, &chain); err != nil {
|
|
|
|
return nil, err
|
2014-12-18 12:12:54 +00:00
|
|
|
}
|
|
|
|
|
2014-12-30 12:32:01 +00:00
|
|
|
return chain, nil
|
2014-12-18 12:12:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func insertChain(done chan bool, chainMan *ChainManager, chain types.Blocks, t *testing.T) {
|
|
|
|
err := chainMan.InsertChain(chain)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
t.FailNow()
|
|
|
|
}
|
|
|
|
done <- true
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestChainInsertions(t *testing.T) {
|
2014-12-30 12:32:01 +00:00
|
|
|
chain1, err := loadChain("chain1", t)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
t.FailNow()
|
|
|
|
}
|
|
|
|
|
|
|
|
chain2, err := loadChain("chain2", t)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
t.FailNow()
|
|
|
|
}
|
|
|
|
|
2014-12-18 12:12:54 +00:00
|
|
|
var eventMux event.TypeMux
|
|
|
|
chainMan := NewChainManager(&eventMux)
|
2014-12-30 12:32:01 +00:00
|
|
|
txPool := NewTxPool(chainMan, &eventMux)
|
2014-12-18 12:12:54 +00:00
|
|
|
blockMan := NewBlockManager(txPool, chainMan, &eventMux)
|
|
|
|
chainMan.SetProcessor(blockMan)
|
|
|
|
|
|
|
|
const max = 2
|
|
|
|
done := make(chan bool, max)
|
|
|
|
|
|
|
|
go insertChain(done, chainMan, chain1, t)
|
|
|
|
go insertChain(done, chainMan, chain2, t)
|
|
|
|
|
|
|
|
for i := 0; i < max; i++ {
|
|
|
|
<-done
|
|
|
|
}
|
2014-12-30 12:32:01 +00:00
|
|
|
|
|
|
|
if reflect.DeepEqual(chain2[len(chain2)-1], chainMan.CurrentBlock()) {
|
|
|
|
t.Error("chain2 is canonical and shouldn't be")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !reflect.DeepEqual(chain1[len(chain1)-1], chainMan.CurrentBlock()) {
|
|
|
|
t.Error("chain1 isn't canonical and should be")
|
|
|
|
}
|
2014-12-17 11:57:35 +00:00
|
|
|
}
|