chain_manager_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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. t.Skip() // travil fails.
  42. db, _ := ethdb.NewMemDatabase()
  43. chain1, err := loadChain("valid1", t)
  44. if err != nil {
  45. fmt.Println(err)
  46. t.FailNow()
  47. }
  48. chain2, err := loadChain("valid2", t)
  49. if err != nil {
  50. fmt.Println(err)
  51. t.FailNow()
  52. }
  53. var eventMux event.TypeMux
  54. chainMan := NewChainManager(db, &eventMux)
  55. txPool := NewTxPool(&eventMux)
  56. blockMan := NewBlockProcessor(db, txPool, chainMan, &eventMux)
  57. chainMan.SetProcessor(blockMan)
  58. const max = 2
  59. done := make(chan bool, max)
  60. go insertChain(done, chainMan, chain1, t)
  61. go insertChain(done, chainMan, chain2, t)
  62. for i := 0; i < max; i++ {
  63. <-done
  64. }
  65. if bytes.Equal(chain2[len(chain2)-1].Hash(), chainMan.CurrentBlock().Hash()) {
  66. t.Error("chain2 is canonical and shouldn't be")
  67. }
  68. if !bytes.Equal(chain1[len(chain1)-1].Hash(), chainMan.CurrentBlock().Hash()) {
  69. t.Error("chain1 isn't canonical and should be")
  70. }
  71. }
  72. func TestChainMultipleInsertions(t *testing.T) {
  73. t.Skip() // travil fails.
  74. db, _ := ethdb.NewMemDatabase()
  75. const max = 4
  76. chains := make([]types.Blocks, max)
  77. var longest int
  78. for i := 0; i < max; i++ {
  79. var err error
  80. name := "valid" + strconv.Itoa(i+1)
  81. chains[i], err = loadChain(name, t)
  82. if len(chains[i]) >= len(chains[longest]) {
  83. longest = i
  84. }
  85. fmt.Println("loaded", name, "with a length of", len(chains[i]))
  86. if err != nil {
  87. fmt.Println(err)
  88. t.FailNow()
  89. }
  90. }
  91. var eventMux event.TypeMux
  92. chainMan := NewChainManager(db, &eventMux)
  93. txPool := NewTxPool(&eventMux)
  94. blockMan := NewBlockProcessor(db, txPool, chainMan, &eventMux)
  95. chainMan.SetProcessor(blockMan)
  96. done := make(chan bool, max)
  97. for i, chain := range chains {
  98. // XXX the go routine would otherwise reference the same (chain[3]) variable and fail
  99. i := i
  100. chain := chain
  101. go func() {
  102. insertChain(done, chainMan, chain, t)
  103. fmt.Println(i, "done")
  104. }()
  105. }
  106. for i := 0; i < max; i++ {
  107. <-done
  108. }
  109. if !bytes.Equal(chains[longest][len(chains[longest])-1].Hash(), chainMan.CurrentBlock().Hash()) {
  110. t.Error("Invalid canonical chain")
  111. }
  112. }
  113. func TestGetAncestors(t *testing.T) {
  114. t.Skip() // travil fails.
  115. db, _ := ethdb.NewMemDatabase()
  116. var eventMux event.TypeMux
  117. chainMan := NewChainManager(db, &eventMux)
  118. chain, err := loadChain("valid1", t)
  119. if err != nil {
  120. fmt.Println(err)
  121. t.FailNow()
  122. }
  123. for _, block := range chain {
  124. chainMan.write(block)
  125. }
  126. ancestors := chainMan.GetAncestors(chain[len(chain)-1], 4)
  127. fmt.Println(ancestors)
  128. }