aboutsummaryrefslogtreecommitdiffstats
path: root/core/chain_manager_test.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2015-06-08 08:19:39 +0800
committerFelix Lange <fjl@twurst.com>2015-06-08 08:19:39 +0800
commit0b493910d38c4f6ed25a196b0e8071dc2afd1fd6 (patch)
treecb2eb3de483d8e01bdf6fb72789b057a212e3eb7 /core/chain_manager_test.go
parent43ceb0f5c73dfde8540693a920e144fa67ffcd46 (diff)
downloadgo-tangerine-0b493910d38c4f6ed25a196b0e8071dc2afd1fd6.tar
go-tangerine-0b493910d38c4f6ed25a196b0e8071dc2afd1fd6.tar.gz
go-tangerine-0b493910d38c4f6ed25a196b0e8071dc2afd1fd6.tar.bz2
go-tangerine-0b493910d38c4f6ed25a196b0e8071dc2afd1fd6.tar.lz
go-tangerine-0b493910d38c4f6ed25a196b0e8071dc2afd1fd6.tar.xz
go-tangerine-0b493910d38c4f6ed25a196b0e8071dc2afd1fd6.tar.zst
go-tangerine-0b493910d38c4f6ed25a196b0e8071dc2afd1fd6.zip
core: fix the nonce check one more time
The block nonce verification was effectively disabled by a typo. This time, there is an actual test for it.
Diffstat (limited to 'core/chain_manager_test.go')
-rw-r--r--core/chain_manager_test.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go
index 560e85f77..45bec7140 100644
--- a/core/chain_manager_test.go
+++ b/core/chain_manager_test.go
@@ -3,6 +3,7 @@ package core
import (
"fmt"
"math/big"
+ "math/rand"
"os"
"path/filepath"
"runtime"
@@ -426,3 +427,55 @@ func TestReorgShortest(t *testing.T) {
}
}
}
+
+func TestInsertNonceError(t *testing.T) {
+ for i := 1; i < 25 && !t.Failed(); i++ {
+ db, _ := ethdb.NewMemDatabase()
+ genesis := GenesisBlock(db)
+ bc := chm(genesis, db)
+ bc.processor = NewBlockProcessor(db, db, bc.pow, bc, bc.eventMux)
+ blocks := makeChain(bc.processor.(*BlockProcessor), bc.currentBlock, i, db, 0)
+
+ fail := rand.Int() % len(blocks)
+ failblock := blocks[fail]
+ bc.pow = failpow{failblock.NumberU64()}
+ n, err := bc.InsertChain(blocks)
+
+ // Check that the returned error indicates the nonce failure.
+ if n != fail {
+ t.Errorf("(i=%d) wrong failed block index: got %d, want %d", i, n, fail)
+ }
+ if !IsBlockNonceErr(err) {
+ t.Fatalf("(i=%d) got %q, want a nonce error", i, err)
+ }
+ nerr := err.(*BlockNonceErr)
+ if nerr.Number.Cmp(failblock.Number()) != 0 {
+ t.Errorf("(i=%d) wrong block number in error, got %v, want %v", i, nerr.Number, failblock.Number())
+ }
+ if nerr.Hash != failblock.Hash() {
+ t.Errorf("(i=%d) wrong block hash in error, got %v, want %v", i, nerr.Hash, failblock.Hash())
+ }
+
+ // Check that all no blocks after the failing block have been inserted.
+ for _, block := range blocks[fail:] {
+ if bc.HasBlock(block.Hash()) {
+ t.Errorf("(i=%d) invalid block %d present in chain", i, block.NumberU64())
+ }
+ }
+ }
+}
+
+// failpow returns false from Verify for a certain block number.
+type failpow struct{ num uint64 }
+
+func (pow failpow) Search(pow.Block, <-chan struct{}) (nonce uint64, mixHash []byte) {
+ return 0, nil
+}
+func (pow failpow) Verify(b pow.Block) bool {
+ return b.NumberU64() != pow.num
+}
+func (pow failpow) GetHashrate() int64 {
+ return 0
+}
+func (pow failpow) Turbo(bool) {
+}