github.com/avahowell/sia@v0.5.1-beta.0.20160524050156-83dcc3d37c94/modules/miner/update_test.go (about)

     1  package miner
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/NebulousLabs/Sia/modules"
     7  )
     8  
     9  // TestIntegrationBlockHeightReorg checks that the miner has the correct block
    10  // height after a series of reorgs that go as far as the genesis block.
    11  func TestIntegrationBlockHeightReorg(t *testing.T) {
    12  	if testing.Short() {
    13  		t.SkipNow()
    14  	}
    15  
    16  	// Create 3 miner testers that will be used to cause eachother to reorg.
    17  	mt1, err := createMinerTester("TestIntegrationBlockHeightReorg - 1")
    18  	if err != nil {
    19  		t.Fatal(err)
    20  	}
    21  	mt2, err := createMinerTester("TestIntegrationBlockHeightReorg - 2")
    22  	if err != nil {
    23  		t.Fatal(err)
    24  	}
    25  	mt3, err := createMinerTester("TestIntegrationBlockHeightReorg - 3")
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  
    30  	// Put one ahead of the other multiple times, which should thrash around
    31  	// the height calculation and cause problems by dipping down to the genesis
    32  	// block repeatedly.
    33  	for i := 0; i < 2; i++ {
    34  		b, err := mt1.miner.AddBlock()
    35  		if err != nil {
    36  			t.Fatal(err)
    37  		}
    38  		mt1.minedBlocks = append(mt1.minedBlocks, b)
    39  	}
    40  	for i := 0; i < 3; i++ {
    41  		b, err := mt2.miner.AddBlock()
    42  		if err != nil {
    43  			t.Fatal(err)
    44  		}
    45  		mt2.minedBlocks = append(mt2.minedBlocks, b)
    46  	}
    47  	for _, block := range mt2.minedBlocks {
    48  		err = mt1.cs.AcceptBlock(block)
    49  		if err != nil && err != modules.ErrNonExtendingBlock {
    50  			t.Fatal(err)
    51  		}
    52  	}
    53  	if mt1.cs.CurrentBlock().ID() != mt2.cs.CurrentBlock().ID() {
    54  		t.Fatal("mt1 and mt2 should have the same current block")
    55  	}
    56  	for i := 0; i < 2; i++ {
    57  		b, err := mt1.miner.AddBlock()
    58  		if err != nil {
    59  			t.Fatal(err)
    60  		}
    61  		mt1.minedBlocks = append(mt1.minedBlocks, b)
    62  	}
    63  	for i := 0; i < 3; i++ {
    64  		b, err := mt2.miner.AddBlock()
    65  		if err != nil {
    66  			t.Fatal(err)
    67  		}
    68  		mt2.minedBlocks = append(mt2.minedBlocks, b)
    69  	}
    70  	for _, block := range mt2.minedBlocks {
    71  		err = mt1.cs.AcceptBlock(block)
    72  		if err != nil && err != modules.ErrNonExtendingBlock && err != modules.ErrBlockKnown {
    73  			t.Fatal(err)
    74  		}
    75  	}
    76  	if mt1.cs.CurrentBlock().ID() != mt2.cs.CurrentBlock().ID() {
    77  		t.Fatal("mt1 and mt2 should have the same current block")
    78  	}
    79  	for i := 0; i < 7; i++ {
    80  		b, err := mt3.miner.AddBlock()
    81  		if err != nil {
    82  			t.Fatal(err)
    83  		}
    84  		mt3.minedBlocks = append(mt3.minedBlocks, b)
    85  	}
    86  	for _, block := range mt3.minedBlocks {
    87  		err = mt1.cs.AcceptBlock(block)
    88  		if err != nil && err != modules.ErrNonExtendingBlock {
    89  			t.Fatal(err)
    90  		}
    91  	}
    92  	if mt1.cs.CurrentBlock().ID() == mt2.cs.CurrentBlock().ID() {
    93  		t.Fatal("mt1 and mt2 should not have the same block height")
    94  	}
    95  	if mt1.cs.CurrentBlock().ID() != mt3.cs.CurrentBlock().ID() {
    96  		t.Fatal("mt1 and mt3 should have the same current block")
    97  	}
    98  }
    99  
   100  // TestMinerHeightForcefulMismatch checks that the miner, when not running in
   101  // debug mode, does forceful self-correcting for height calculation.
   102  func TestMinerHeightForcefulMismatch(t *testing.T) {
   103  	if testing.Short() {
   104  		t.SkipNow()
   105  	}
   106  	mt, err := createMinerTester("TestMinerHeightForcefulMismatch")
   107  	if err != nil {
   108  		t.Fatal(err)
   109  	}
   110  	b, err := mt.miner.FindBlock()
   111  	if err != nil {
   112  		t.Fatal(err)
   113  	}
   114  
   115  	// A panic should be triggered when AcceptBlock is called on the miner.
   116  	mt.miner.persist.Height--
   117  	defer func() {
   118  		r := recover()
   119  		if r == nil {
   120  			t.Fatal("expecting a panic upon adding a block")
   121  		}
   122  	}()
   123  	err = mt.cs.AcceptBlock(b)
   124  	if err != nil {
   125  		t.Fatal(err)
   126  	}
   127  }