chain_manager_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package core
  2. import (
  3. "fmt"
  4. "os"
  5. "path"
  6. "reflect"
  7. "runtime"
  8. "strconv"
  9. "testing"
  10. "github.com/ethereum/go-ethereum/core/types"
  11. "github.com/ethereum/go-ethereum/ethdb"
  12. "github.com/ethereum/go-ethereum/ethutil"
  13. "github.com/ethereum/go-ethereum/event"
  14. "github.com/ethereum/go-ethereum/rlp"
  15. )
  16. //var Logger logpkg.LogSystem
  17. //var Log = logpkg.NewLogger("TEST")
  18. func init() {
  19. runtime.GOMAXPROCS(runtime.NumCPU())
  20. //Logger = logpkg.NewStdLogSystem(os.Stdout, log.LstdFlags, logpkg.DebugLevel)
  21. //logpkg.AddLogSystem(Logger)
  22. ethutil.ReadConfig("/tmp/ethtest", "/tmp/ethtest", "ETH")
  23. db, err := ethdb.NewMemDatabase()
  24. if err != nil {
  25. panic("Could not create mem-db, failing")
  26. }
  27. ethutil.Config.Db = db
  28. }
  29. func loadChain(fn string, t *testing.T) (types.Blocks, error) {
  30. fh, err := os.OpenFile(path.Join("..", "_data", fn), os.O_RDONLY, os.ModePerm)
  31. if err != nil {
  32. return nil, err
  33. }
  34. defer fh.Close()
  35. var chain types.Blocks
  36. if err := rlp.Decode(fh, &chain); err != nil {
  37. return nil, err
  38. }
  39. return chain, nil
  40. }
  41. func insertChain(done chan bool, chainMan *ChainManager, chain types.Blocks, t *testing.T) {
  42. err := chainMan.InsertChain(chain)
  43. done <- true
  44. if err != nil {
  45. fmt.Println(err)
  46. t.FailNow()
  47. }
  48. }
  49. func TestChainInsertions(t *testing.T) {
  50. chain1, err := loadChain("valid1", t)
  51. if err != nil {
  52. fmt.Println(err)
  53. t.FailNow()
  54. }
  55. fmt.Println(len(chain1))
  56. chain2, err := loadChain("valid2", t)
  57. if err != nil {
  58. fmt.Println(err)
  59. t.FailNow()
  60. }
  61. var eventMux event.TypeMux
  62. chainMan := NewChainManager(&eventMux)
  63. txPool := NewTxPool(chainMan, &eventMux)
  64. blockMan := NewBlockManager(txPool, chainMan, &eventMux)
  65. chainMan.SetProcessor(blockMan)
  66. const max = 2
  67. done := make(chan bool, max)
  68. go insertChain(done, chainMan, chain1, t)
  69. go insertChain(done, chainMan, chain2, t)
  70. for i := 0; i < max; i++ {
  71. <-done
  72. }
  73. if reflect.DeepEqual(chain2[len(chain2)-1], chainMan.CurrentBlock()) {
  74. t.Error("chain2 is canonical and shouldn't be")
  75. }
  76. if !reflect.DeepEqual(chain1[len(chain1)-1], chainMan.CurrentBlock()) {
  77. t.Error("chain1 isn't canonical and should be")
  78. }
  79. }
  80. func TestChainMultipleInsertions(t *testing.T) {
  81. const max = 4
  82. chains := make([]types.Blocks, max)
  83. var longest int
  84. for i := 0; i < max; i++ {
  85. var err error
  86. name := "valid" + strconv.Itoa(i+1)
  87. chains[i], err = loadChain(name, t)
  88. if len(chains[i]) >= len(chains[longest]) {
  89. longest = i
  90. }
  91. fmt.Println("loaded", name, "with a length of", len(chains[i]))
  92. if err != nil {
  93. fmt.Println(err)
  94. t.FailNow()
  95. }
  96. }
  97. var eventMux event.TypeMux
  98. chainMan := NewChainManager(&eventMux)
  99. txPool := NewTxPool(chainMan, &eventMux)
  100. blockMan := NewBlockManager(txPool, chainMan, &eventMux)
  101. chainMan.SetProcessor(blockMan)
  102. done := make(chan bool, max)
  103. for i, chain := range chains {
  104. var i int = i
  105. go func() {
  106. insertChain(done, chainMan, chain, t)
  107. fmt.Println(i, "done")
  108. }()
  109. }
  110. for i := 0; i < max; i++ {
  111. <-done
  112. }
  113. if !reflect.DeepEqual(chains[longest][len(chains[longest])-1], chainMan.CurrentBlock()) {
  114. t.Error("Invalid canonical chain")
  115. }
  116. }