mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 15:16:43 +00:00
core/rawdb: add test
This commit is contained in:
parent
c4313bcfc8
commit
e447da2305
3 changed files with 46 additions and 2 deletions
|
|
@ -737,6 +737,9 @@ func writeAncientBlock(op ethdb.AncientWriteOp, block *types.Block, header *type
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteAncientHeaderChain writes the supplied headers along with nil block
|
||||||
|
// bodies and receipts into the ancient store. It's supposed to be used for
|
||||||
|
// storing chain segment before the chain cutoff.
|
||||||
func WriteAncientHeaderChain(db ethdb.AncientWriter, headers []*types.Header) (int64, error) {
|
func WriteAncientHeaderChain(db ethdb.AncientWriter, headers []*types.Header) (int64, error) {
|
||||||
return db.ModifyAncients(func(op ethdb.AncientWriteOp) error {
|
return db.ModifyAncients(func(op ethdb.AncientWriteOp) error {
|
||||||
for _, header := range headers {
|
for _, header := range headers {
|
||||||
|
|
|
||||||
|
|
@ -464,6 +464,48 @@ func TestAncientStorage(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWriteAncientHeaderChain(t *testing.T) {
|
||||||
|
db, err := NewDatabaseWithFreezer(NewMemoryDatabase(), t.TempDir(), "", false)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create database with ancient backend")
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
// Create a test block
|
||||||
|
var headers []*types.Header
|
||||||
|
headers = append(headers, &types.Header{
|
||||||
|
Number: big.NewInt(0),
|
||||||
|
Extra: []byte("test block"),
|
||||||
|
UncleHash: types.EmptyUncleHash,
|
||||||
|
TxHash: types.EmptyTxsHash,
|
||||||
|
ReceiptHash: types.EmptyReceiptsHash,
|
||||||
|
})
|
||||||
|
headers = append(headers, &types.Header{
|
||||||
|
Number: big.NewInt(1),
|
||||||
|
Extra: []byte("test block"),
|
||||||
|
UncleHash: types.EmptyUncleHash,
|
||||||
|
TxHash: types.EmptyTxsHash,
|
||||||
|
ReceiptHash: types.EmptyReceiptsHash,
|
||||||
|
})
|
||||||
|
// Write and verify the header in the database
|
||||||
|
WriteAncientHeaderChain(db, headers)
|
||||||
|
|
||||||
|
for _, header := range headers {
|
||||||
|
if blob := ReadHeaderRLP(db, header.Hash(), header.Number.Uint64()); len(blob) == 0 {
|
||||||
|
t.Fatalf("no header returned")
|
||||||
|
}
|
||||||
|
if h := ReadCanonicalHash(db, header.Number.Uint64()); h != header.Hash() {
|
||||||
|
t.Fatalf("no canonical hash returned")
|
||||||
|
}
|
||||||
|
if blob := ReadBodyRLP(db, header.Hash(), header.Number.Uint64()); len(blob) != 0 {
|
||||||
|
t.Fatalf("unexpected body returned")
|
||||||
|
}
|
||||||
|
if blob := ReadReceiptsRLP(db, header.Hash(), header.Number.Uint64()); len(blob) != 0 {
|
||||||
|
t.Fatalf("unexpected body returned")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestCanonicalHashIteration(t *testing.T) {
|
func TestCanonicalHashIteration(t *testing.T) {
|
||||||
var cases = []struct {
|
var cases = []struct {
|
||||||
from, to uint64
|
from, to uint64
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@
|
||||||
package downloader
|
package downloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -308,7 +307,7 @@ func (d *Downloader) fetchHeaders(from uint64) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if h == nil {
|
if h == nil {
|
||||||
return errors.New("header at chain cutoff is not available")
|
return fmt.Errorf("header at chain cutoff is not available, cutoff: %d", d.chainCutoffNumber)
|
||||||
}
|
}
|
||||||
if h.Hash() != d.chainCutoffHash {
|
if h.Hash() != d.chainCutoffHash {
|
||||||
return fmt.Errorf("header at chain cutoff mismatched, want: %v, got: %v", d.chainCutoffHash, h.Hash())
|
return fmt.Errorf("header at chain cutoff mismatched, want: %v, got: %v", d.chainCutoffHash, h.Hash())
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue