chain_manager_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package core
  2. import (
  3. "bytes"
  4. "fmt"
  5. "os"
  6. "path"
  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. func init() {
  17. runtime.GOMAXPROCS(runtime.NumCPU())
  18. ethutil.ReadConfig("/tmp/ethtest", "/tmp/ethtest", "ETH")
  19. }
  20. func loadChain(fn string, t *testing.T) (types.Blocks, error) {
  21. fh, err := os.OpenFile(path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "_data", fn), os.O_RDONLY, os.ModePerm)
  22. if err != nil {
  23. return nil, err
  24. }
  25. defer fh.Close()
  26. var chain types.Blocks
  27. if err := rlp.Decode(fh, &chain); err != nil {
  28. return nil, err
  29. }
  30. return chain, nil
  31. }
  32. func insertChain(done chan bool, chainMan *ChainManager, chain types.Blocks, t *testing.T) {
  33. err := chainMan.InsertChain(chain)
  34. if err != nil {
  35. fmt.Println(err)
  36. t.FailNow()
  37. }
  38. done <- true
  39. }
  40. func TestChainInsertions(t *testing.T) {
  41. db, _ := ethdb.NewMemDatabase()
  42. chain1, err := loadChain("valid1", t)
  43. if err != nil {
  44. fmt.Println(err)
  45. t.FailNow()
  46. }
  47. chain2, err := loadChain("valid2", t)
  48. if err != nil {
  49. fmt.Println(err)
  50. t.FailNow()
  51. }
  52. var eventMux event.TypeMux
  53. chainMan := NewChainManager(db, &eventMux)
  54. txPool := NewTxPool(&eventMux)
  55. blockMan := NewBlockProcessor(db, txPool, chainMan, &eventMux)
  56. chainMan.SetProcessor(blockMan)
  57. const max = 2
  58. done := make(chan bool, max)
  59. go insertChain(done, chainMan, chain1, t)
  60. go insertChain(done, chainMan, chain2, t)
  61. for i := 0; i < max; i++ {
  62. <-done
  63. }
  64. if bytes.Equal(chain2[len(chain2)-1].Hash(), chainMan.CurrentBlock().Hash()) {
  65. t.Error("chain2 is canonical and shouldn't be")
  66. }
  67. if !bytes.Equal(chain1[len(chain1)-1].Hash(), chainMan.CurrentBlock().Hash()) {
  68. t.Error("chain1 isn't canonical and should be")
  69. }
  70. }
  71. func TestChainMultipleInsertions(t *testing.T) {
  72. db, _ := ethdb.NewMemDatabase()
  73. const max = 4
  74. chains := make([]types.Blocks, max)
  75. var longest int
  76. for i := 0; i < max; i++ {
  77. var err error
  78. name := "valid" + strconv.Itoa(i+1)
  79. chains[i], err = loadChain(name, t)
  80. if len(chains[i]) >= len(chains[longest]) {
  81. longest = i
  82. }
  83. fmt.Println("loaded", name, "with a length of", len(chains[i]))
  84. if err != nil {
  85. fmt.Println(err)
  86. t.FailNow()
  87. }
  88. }
  89. var eventMux event.TypeMux
  90. chainMan := NewChainManager(db, &eventMux)
  91. txPool := NewTxPool(&eventMux)
  92. blockMan := NewBlockProcessor(db, txPool, chainMan, &eventMux)
  93. chainMan.SetProcessor(blockMan)
  94. done := make(chan bool, max)
  95. for i, chain := range chains {
  96. // XXX the go routine would otherwise reference the same (chain[3]) variable and fail
  97. i := i
  98. chain := chain
  99. go func() {
  100. insertChain(done, chainMan, chain, t)
  101. fmt.Println(i, "done")
  102. }()
  103. }
  104. for i := 0; i < max; i++ {
  105. <-done
  106. }
  107. if !bytes.Equal(chains[longest][len(chains[longest])-1].Hash(), chainMan.CurrentBlock().Hash()) {
  108. t.Error("Invalid canonical chain")
  109. }
  110. }
  111. func TestGetAncestors(t *testing.T) {
  112. db, _ := ethdb.NewMemDatabase()
  113. var eventMux event.TypeMux
  114. chainMan := NewChainManager(db, &eventMux)
  115. chain, err := loadChain("valid1", t)
  116. if err != nil {
  117. fmt.Println(err)
  118. t.FailNow()
  119. }
  120. for _, block := range chain {
  121. chainMan.write(block)
  122. }
  123. ancestors := chainMan.GetAncestors(chain[len(chain)-1], 4)
  124. fmt.Println(ancestors)
  125. }