This merge commit adds the following code from the github.com/decred/dcrutil package into a new github.com/decred/dcrd/dcrutil package: * Address handling * Amount type * AppDataDir func * bitflags functions * Block wrapper type * Hash160 func * Tx wrapper type * WIF type as well as all tests for this code. The old github.com/decred/dcrutil/hdkeychain package has also been merged and moved to github.com/decred/dcrd/dcrutil/hdkeychain. dcrd packages have been updated to use the new packages and the dep files have been updated for this change.
132 lines
4.0 KiB
Go
132 lines
4.0 KiB
Go
// Copyright (c) 2013-2016 The btcsuite developers
|
|
// Copyright (c) 2015-2017 The Decred developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package blockchain_test
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/bzip2"
|
|
"encoding/gob"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/decred/dcrd/blockchain"
|
|
"github.com/decred/dcrd/chaincfg"
|
|
"github.com/decred/dcrd/chaincfg/chainhash"
|
|
"github.com/decred/dcrd/dcrutil"
|
|
)
|
|
|
|
// cloneParams returns a deep copy of the provided parameters so the caller is
|
|
// free to modify them without worrying about interfering with other tests.
|
|
func cloneParams(params *chaincfg.Params) *chaincfg.Params {
|
|
// Encode via gob.
|
|
buf := new(bytes.Buffer)
|
|
enc := gob.NewEncoder(buf)
|
|
enc.Encode(params)
|
|
|
|
// Decode via gob to make a deep copy.
|
|
var paramsCopy chaincfg.Params
|
|
dec := gob.NewDecoder(buf)
|
|
dec.Decode(¶msCopy)
|
|
return ¶msCopy
|
|
}
|
|
|
|
// mustParseHash converts the passed big-endian hex string into a
|
|
// chainhash.Hash and will panic if there is an error. It only differs from the
|
|
// one available in chainhash in that it will panic so errors in the source code
|
|
// be detected. It will only (and must only) be called with hard-coded, and
|
|
// therefore known good, hashes.
|
|
func mustParseHash(s string) *chainhash.Hash {
|
|
hash, err := chainhash.NewHashFromStr(s)
|
|
if err != nil {
|
|
panic("invalid hash in source file: " + s)
|
|
}
|
|
return hash
|
|
}
|
|
|
|
// TestBlockchainFunction tests the various blockchain API to ensure proper
|
|
// functionality.
|
|
func TestBlockchainFunctions(t *testing.T) {
|
|
// Update simnet parameters to reflect what is expected by the legacy
|
|
// data.
|
|
params := cloneParams(&chaincfg.SimNetParams)
|
|
params.GenesisBlock.Header.MerkleRoot = *mustParseHash("a216ea043f0d481a072424af646787794c32bcefd3ed181a090319bbf8a37105")
|
|
genesisHash := params.GenesisBlock.BlockHash()
|
|
params.GenesisHash = &genesisHash
|
|
|
|
// Create a new database and chain instance to run tests against.
|
|
chain, teardownFunc, err := chainSetup("validateunittests", params)
|
|
if err != nil {
|
|
t.Errorf("Failed to setup chain instance: %v", err)
|
|
return
|
|
}
|
|
defer teardownFunc()
|
|
|
|
// Load up the rest of the blocks up to HEAD~1.
|
|
filename := filepath.Join("testdata/", "blocks0to168.bz2")
|
|
fi, err := os.Open(filename)
|
|
if err != nil {
|
|
t.Errorf("Unable to open %s: %v", filename, err)
|
|
}
|
|
bcStream := bzip2.NewReader(fi)
|
|
defer fi.Close()
|
|
|
|
// Create a buffer of the read file.
|
|
bcBuf := new(bytes.Buffer)
|
|
bcBuf.ReadFrom(bcStream)
|
|
|
|
// Create decoder from the buffer and a map to store the data.
|
|
bcDecoder := gob.NewDecoder(bcBuf)
|
|
blockChain := make(map[int64][]byte)
|
|
|
|
// Decode the blockchain into the map.
|
|
if err := bcDecoder.Decode(&blockChain); err != nil {
|
|
t.Errorf("error decoding test blockchain: %v", err.Error())
|
|
}
|
|
|
|
// Insert blocks 1 to 168 and perform various tests.
|
|
for i := 1; i <= 168; i++ {
|
|
bl, err := dcrutil.NewBlockFromBytes(blockChain[int64(i)])
|
|
if err != nil {
|
|
t.Errorf("NewBlockFromBytes error: %v", err.Error())
|
|
}
|
|
|
|
_, _, err = chain.ProcessBlock(bl, blockchain.BFNone)
|
|
if err != nil {
|
|
t.Fatalf("ProcessBlock error at height %v: %v", i, err.Error())
|
|
}
|
|
}
|
|
|
|
val, err := chain.TicketPoolValue()
|
|
if err != nil {
|
|
t.Errorf("Failed to get ticket pool value: %v", err)
|
|
}
|
|
expectedVal := dcrutil.Amount(3495091704)
|
|
if val != expectedVal {
|
|
t.Errorf("Failed to get correct result for ticket pool value; "+
|
|
"want %v, got %v", expectedVal, val)
|
|
}
|
|
|
|
a, _ := dcrutil.DecodeAddress("SsbKpMkPnadDcZFFZqRPY8nvdFagrktKuzB")
|
|
hs, err := chain.TicketsWithAddress(a)
|
|
if err != nil {
|
|
t.Errorf("Failed to do TicketsWithAddress: %v", err)
|
|
}
|
|
expectedLen := 223
|
|
if len(hs) != expectedLen {
|
|
t.Errorf("Failed to get correct number of tickets for "+
|
|
"TicketsWithAddress; want %v, got %v", expectedLen, len(hs))
|
|
}
|
|
|
|
totalSubsidy := chain.TotalSubsidy()
|
|
expectedSubsidy := int64(35783267326630)
|
|
if expectedSubsidy != totalSubsidy {
|
|
t.Errorf("Failed to get correct total subsidy for "+
|
|
"TotalSubsidy; want %v, got %v", expectedSubsidy,
|
|
totalSubsidy)
|
|
}
|
|
}
|