Add loadBlocks infrastructure to interface tests.
This commit is contained in:
parent
a27c37793b
commit
562294f938
1 changed files with 88 additions and 0 deletions
|
@ -5,14 +5,33 @@
|
||||||
package btcdb_test
|
package btcdb_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"compress/bzip2"
|
||||||
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/conformal/btcdb"
|
"github.com/conformal/btcdb"
|
||||||
_ "github.com/conformal/btcdb/ldb"
|
_ "github.com/conformal/btcdb/ldb"
|
||||||
_ "github.com/conformal/btcdb/sqlite3"
|
_ "github.com/conformal/btcdb/sqlite3"
|
||||||
"github.com/conformal/btcutil"
|
"github.com/conformal/btcutil"
|
||||||
"github.com/conformal/btcwire"
|
"github.com/conformal/btcwire"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// network is the expected bitcoin network in the test block data.
|
||||||
|
network = btcwire.MainNet
|
||||||
|
|
||||||
|
// savedBlocks is used to store blocks loaded from the blockDataFile
|
||||||
|
// so multiple invocations to loadBlocks from the various test functions
|
||||||
|
// do not have to reload them from disk.
|
||||||
|
savedBlocks []*btcutil.Block
|
||||||
|
|
||||||
|
// blockDataFile is the path to a file containing the first 256 blocks
|
||||||
|
// of the block chain.
|
||||||
|
blockDataFile = filepath.Join("testdata", "blocks1-256.bz2")
|
||||||
)
|
)
|
||||||
|
|
||||||
var zeroHash = btcwire.ShaHash{}
|
var zeroHash = btcwire.ShaHash{}
|
||||||
|
@ -129,3 +148,72 @@ func setupDB(dbType, dbName string) (btcdb.Db, func(), error) {
|
||||||
|
|
||||||
return db, teardown, nil
|
return db, teardown, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// loadBlocks loads the blocks contained in the testdata directory and returns
|
||||||
|
// a slice of them.
|
||||||
|
func loadBlocks(t *testing.T) ([]*btcutil.Block, error) {
|
||||||
|
if len(savedBlocks) != 0 {
|
||||||
|
return savedBlocks, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var dr io.Reader
|
||||||
|
fi, err := os.Open(blockDataFile)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("failed to open file %v, err %v", blockDataFile, err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if strings.HasSuffix(blockDataFile, ".bz2") {
|
||||||
|
z := bzip2.NewReader(fi)
|
||||||
|
dr = z
|
||||||
|
} else {
|
||||||
|
dr = fi
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err := fi.Close(); err != nil {
|
||||||
|
t.Errorf("failed to close file %v %v", blockDataFile, err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Set the first block as the genesis block.
|
||||||
|
blocks := make([]*btcutil.Block, 0, 256)
|
||||||
|
genesis := btcutil.NewBlock(&btcwire.GenesisBlock)
|
||||||
|
blocks = append(blocks, genesis)
|
||||||
|
|
||||||
|
for height := int64(1); err == nil; height++ {
|
||||||
|
var rintbuf uint32
|
||||||
|
err := binary.Read(dr, binary.LittleEndian, &rintbuf)
|
||||||
|
if err == io.EOF {
|
||||||
|
// hit end of file at expected offset: no warning
|
||||||
|
height--
|
||||||
|
err = nil
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("failed to load network type, err %v", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if rintbuf != uint32(network) {
|
||||||
|
t.Errorf("Block doesn't match network: %v expects %v",
|
||||||
|
rintbuf, network)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
err = binary.Read(dr, binary.LittleEndian, &rintbuf)
|
||||||
|
blocklen := rintbuf
|
||||||
|
|
||||||
|
rbytes := make([]byte, blocklen)
|
||||||
|
|
||||||
|
// read block
|
||||||
|
dr.Read(rbytes)
|
||||||
|
|
||||||
|
block, err := btcutil.NewBlockFromBytes(rbytes)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("failed to parse block %v", height)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
blocks = append(blocks, block)
|
||||||
|
}
|
||||||
|
|
||||||
|
savedBlocks = blocks
|
||||||
|
return blocks, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue