Setup public http server test
parent
caab79ed94
commit
cc11ae1e57
|
@ -64,17 +64,17 @@ func closeAndDestroyRocksDB(t *testing.T, d *RocksDB) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func inputAddressToPubKeyHexWithLength(addr string, t *testing.T, d *RocksDB) string {
|
func inputAddressToPubKeyHexWithLength(addr string, t *testing.T, d *RocksDB) string {
|
||||||
h := dbtestdata.AddressToPubKeyHex(addr, t, d.chainParser)
|
h := dbtestdata.AddressToPubKeyHex(addr, d.chainParser)
|
||||||
return hex.EncodeToString([]byte{byte(len(h) / 2)}) + h
|
return hex.EncodeToString([]byte{byte(len(h) / 2)}) + h
|
||||||
}
|
}
|
||||||
|
|
||||||
func addressToPubKeyHexWithLength(addr string, t *testing.T, d *RocksDB) string {
|
func addressToPubKeyHexWithLength(addr string, t *testing.T, d *RocksDB) string {
|
||||||
h := dbtestdata.AddressToPubKeyHex(addr, t, d.chainParser)
|
h := dbtestdata.AddressToPubKeyHex(addr, d.chainParser)
|
||||||
return hex.EncodeToString([]byte{byte(len(h))}) + h
|
return hex.EncodeToString([]byte{byte(len(h))}) + h
|
||||||
}
|
}
|
||||||
|
|
||||||
func spentAddressToPubKeyHexWithLength(addr string, t *testing.T, d *RocksDB) string {
|
func spentAddressToPubKeyHexWithLength(addr string, t *testing.T, d *RocksDB) string {
|
||||||
h := dbtestdata.AddressToPubKeyHex(addr, t, d.chainParser)
|
h := dbtestdata.AddressToPubKeyHex(addr, d.chainParser)
|
||||||
return hex.EncodeToString([]byte{byte(len(h) + 1)}) + h
|
return hex.EncodeToString([]byte{byte(len(h) + 1)}) + h
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,11 +165,11 @@ func verifyAfterUTXOBlock1(t *testing.T, d *RocksDB, afterDisconnect bool) {
|
||||||
}
|
}
|
||||||
// the vout is encoded as signed varint, i.e. value * 2 for non negative values
|
// the vout is encoded as signed varint, i.e. value * 2 for non negative values
|
||||||
if err := checkColumn(d, cfAddresses, []keyPair{
|
if err := checkColumn(d, cfAddresses, []keyPair{
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "00", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "00", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "02", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "02", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "00", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "00", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "02", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "02", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "04", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "04", nil},
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
{
|
{
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -201,11 +201,11 @@ func verifyAfterUTXOBlock1(t *testing.T, d *RocksDB, afterDisconnect bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := checkColumn(d, cfAddressBalance, []keyPair{
|
if err := checkColumn(d, cfAddressBalance, []keyPair{
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T1A1), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T1A1), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T1A2), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T1A2), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T2A3), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T2A3), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T2A4), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T2A4), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T2A5), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T2A5), nil},
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
{
|
{
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -250,20 +250,20 @@ func verifyAfterUTXOBlock2(t *testing.T, d *RocksDB) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := checkColumn(d, cfAddresses, []keyPair{
|
if err := checkColumn(d, cfAddresses, []keyPair{
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "00", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "00", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "02", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "02", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "00", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "00", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "02", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "02", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "04", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "04", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr6, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "00" + dbtestdata.TxidB2T2 + "01", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr6, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "00" + dbtestdata.TxidB2T2 + "01", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr7, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "02", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr7, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "02", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr8, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "00", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr8, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "00", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr9, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "02", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr9, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "02", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "01", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "01", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "03", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "03", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T3 + "00" + dbtestdata.TxidB2T3 + "01", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser) + "000370d6", dbtestdata.TxidB2T3 + "00" + dbtestdata.TxidB2T3 + "01", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.AddrA, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T4 + "00", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.AddrA, d.chainParser) + "000370d6", dbtestdata.TxidB2T4 + "00", nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "03", nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "03", nil},
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
{
|
{
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -335,16 +335,16 @@ func verifyAfterUTXOBlock2(t *testing.T, d *RocksDB) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := checkColumn(d, cfAddressBalance, []keyPair{
|
if err := checkColumn(d, cfAddressBalance, []keyPair{
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T1A1), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T1A1), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, t, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T1A2) + bigintToHex(dbtestdata.SatZero), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T1A2) + bigintToHex(dbtestdata.SatZero), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, t, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T2A3) + bigintToHex(dbtestdata.SatZero), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T2A3) + bigintToHex(dbtestdata.SatZero), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, t, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T2A4) + bigintToHex(dbtestdata.SatZero), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T2A4) + bigintToHex(dbtestdata.SatZero), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, t, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T2A5) + bigintToHex(dbtestdata.SatB2T3A5), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T2A5) + bigintToHex(dbtestdata.SatB2T3A5), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr6, t, d.chainParser), "02" + bigintToHex(dbtestdata.SatB2T1A6) + bigintToHex(dbtestdata.SatZero), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr6, d.chainParser), "02" + bigintToHex(dbtestdata.SatB2T1A6) + bigintToHex(dbtestdata.SatZero), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr7, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T1A7), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr7, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T1A7), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr8, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T2A8), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr8, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T2A8), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr9, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T2A9), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr9, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T2A9), nil},
|
||||||
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.AddrA, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T4AA), nil},
|
keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.AddrA, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T4AA), nil},
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
{
|
{
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -438,14 +438,14 @@ func TestRocksDB_Index_UTXO(t *testing.T) {
|
||||||
defer closeAndDestroyRocksDB(t, d)
|
defer closeAndDestroyRocksDB(t, d)
|
||||||
|
|
||||||
// connect 1st block - will log warnings about missing UTXO transactions in txAddresses column
|
// connect 1st block - will log warnings about missing UTXO transactions in txAddresses column
|
||||||
block1 := dbtestdata.GetTestUTXOBlock1(t, d.chainParser)
|
block1 := dbtestdata.GetTestUTXOBlock1(d.chainParser)
|
||||||
if err := d.ConnectBlock(block1); err != nil {
|
if err := d.ConnectBlock(block1); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
verifyAfterUTXOBlock1(t, d, false)
|
verifyAfterUTXOBlock1(t, d, false)
|
||||||
|
|
||||||
// connect 2nd block - use some outputs from the 1st block as the inputs and 1 input uses tx from the same block
|
// connect 2nd block - use some outputs from the 1st block as the inputs and 1 input uses tx from the same block
|
||||||
block2 := dbtestdata.GetTestUTXOBlock2(t, d.chainParser)
|
block2 := dbtestdata.GetTestUTXOBlock2(d.chainParser)
|
||||||
if err := d.ConnectBlock(block2); err != nil {
|
if err := d.ConnectBlock(block2); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -640,7 +640,7 @@ func Test_BulkConnect_UTXO(t *testing.T) {
|
||||||
t.Fatal("DB not in DbStateInconsistent")
|
t.Fatal("DB not in DbStateInconsistent")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := bc.ConnectBlock(dbtestdata.GetTestUTXOBlock1(t, d.chainParser), false); err != nil {
|
if err := bc.ConnectBlock(dbtestdata.GetTestUTXOBlock1(d.chainParser), false); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := checkColumn(d, cfBlockTxs, []keyPair{}); err != nil {
|
if err := checkColumn(d, cfBlockTxs, []keyPair{}); err != nil {
|
||||||
|
@ -649,7 +649,7 @@ func Test_BulkConnect_UTXO(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := bc.ConnectBlock(dbtestdata.GetTestUTXOBlock2(t, d.chainParser), true); err != nil {
|
if err := bc.ConnectBlock(dbtestdata.GetTestUTXOBlock2(d.chainParser), true); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
// build unittest
|
||||||
|
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"blockbook/bchain"
|
||||||
|
"blockbook/bchain/coins/btc"
|
||||||
|
"blockbook/common"
|
||||||
|
"blockbook/db"
|
||||||
|
"blockbook/tests/dbtestdata"
|
||||||
|
"io/ioutil"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
"github.com/jakm/btcutil/chaincfg"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// set the current directory to blockbook root so that ./static/ works
|
||||||
|
if err := os.Chdir(".."); err != nil {
|
||||||
|
glog.Fatal("Chdir error:", err)
|
||||||
|
}
|
||||||
|
c := m.Run()
|
||||||
|
chaincfg.ResetParams()
|
||||||
|
os.Exit(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupRocksDB(t *testing.T, parser bchain.BlockChainParser) (*db.RocksDB, *common.InternalState, string) {
|
||||||
|
tmp, err := ioutil.TempDir("", "testdb")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
d, err := db.NewRocksDB(tmp, 100000, -1, parser, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
is, err := d.LoadInternalState("btc-testnet")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
d.SetInternalState(is)
|
||||||
|
// import data
|
||||||
|
if err := d.ConnectBlock(dbtestdata.GetTestUTXOBlock1(parser)); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := d.ConnectBlock(dbtestdata.GetTestUTXOBlock2(parser)); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
return d, is, tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
// getFreePort asks the kernel for a free open port that is ready to use
|
||||||
|
func getFreePort() (int, error) {
|
||||||
|
addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
l, err := net.ListenTCP("tcp", addr)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
defer l.Close()
|
||||||
|
return l.Addr().(*net.TCPAddr).Port, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupPublicHTTPServer(t *testing.T) (*PublicServer, string, string) {
|
||||||
|
parser := btc.NewBitcoinParser(
|
||||||
|
btc.GetChainParams("test"),
|
||||||
|
&btc.Configuration{BlockAddressesToKeep: 1})
|
||||||
|
|
||||||
|
db, is, path := setupRocksDB(t, parser)
|
||||||
|
|
||||||
|
port, err := getFreePort()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
metrics, err := common.GetMetrics("Testnet")
|
||||||
|
if err != nil {
|
||||||
|
glog.Fatal("metrics: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
chain, err := dbtestdata.NewFakeBlockChain(parser)
|
||||||
|
if err != nil {
|
||||||
|
glog.Fatal("metrics: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
binding := "localhost:" + strconv.Itoa(port)
|
||||||
|
|
||||||
|
s, err := NewPublicServer(binding, "", db, chain, nil, "", metrics, is, false)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
return s, binding, path
|
||||||
|
}
|
||||||
|
|
||||||
|
func closeAndDestroyPublicServer(t *testing.T, s *PublicServer, dbpath string) {
|
||||||
|
|
||||||
|
// destroy db
|
||||||
|
if err := s.db.Close(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
os.RemoveAll(dbpath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_PublicServer_UTXO(t *testing.T) {
|
||||||
|
s, _, dbpath := setupPublicHTTPServer(t)
|
||||||
|
defer closeAndDestroyPublicServer(t, s, dbpath)
|
||||||
|
}
|
|
@ -4,19 +4,9 @@ import (
|
||||||
"blockbook/bchain"
|
"blockbook/bchain"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func AddressToPubKeyHex(addr string, t *testing.T, parser bchain.BlockChainParser) string {
|
"github.com/golang/glog"
|
||||||
if addr == "" {
|
)
|
||||||
return ""
|
|
||||||
}
|
|
||||||
b, err := parser.GetAddrDescFromAddress(addr)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
return hex.EncodeToString(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
TxidB1T1 = "00b2c06055e5e90e9c82bd4181fde310104391a7fa4f289b1704e5d90caa3840"
|
TxidB1T1 = "00b2c06055e5e90e9c82bd4181fde310104391a7fa4f289b1704e5d90caa3840"
|
||||||
|
@ -53,7 +43,18 @@ var (
|
||||||
SatB2T4AA = big.NewInt(1360030331)
|
SatB2T4AA = big.NewInt(1360030331)
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetTestUTXOBlock1(t *testing.T, parser bchain.BlockChainParser) *bchain.Block {
|
func AddressToPubKeyHex(addr string, parser bchain.BlockChainParser) string {
|
||||||
|
if addr == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
b, err := parser.GetAddrDescFromAddress(addr)
|
||||||
|
if err != nil {
|
||||||
|
glog.Fatal(err)
|
||||||
|
}
|
||||||
|
return hex.EncodeToString(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetTestUTXOBlock1(parser bchain.BlockChainParser) *bchain.Block {
|
||||||
return &bchain.Block{
|
return &bchain.Block{
|
||||||
BlockHeader: bchain.BlockHeader{
|
BlockHeader: bchain.BlockHeader{
|
||||||
Height: 225493,
|
Height: 225493,
|
||||||
|
@ -68,14 +69,14 @@ func GetTestUTXOBlock1(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 0,
|
N: 0,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr1, t, parser),
|
Hex: AddressToPubKeyHex(Addr1, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB1T1A1,
|
ValueSat: *SatB1T1A1,
|
||||||
},
|
},
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 1,
|
N: 1,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr2, t, parser),
|
Hex: AddressToPubKeyHex(Addr2, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB1T1A2,
|
ValueSat: *SatB1T1A2,
|
||||||
},
|
},
|
||||||
|
@ -89,21 +90,21 @@ func GetTestUTXOBlock1(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 0,
|
N: 0,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr3, t, parser),
|
Hex: AddressToPubKeyHex(Addr3, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB1T2A3,
|
ValueSat: *SatB1T2A3,
|
||||||
},
|
},
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 1,
|
N: 1,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr4, t, parser),
|
Hex: AddressToPubKeyHex(Addr4, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB1T2A4,
|
ValueSat: *SatB1T2A4,
|
||||||
},
|
},
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 2,
|
N: 2,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr5, t, parser),
|
Hex: AddressToPubKeyHex(Addr5, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB1T2A5,
|
ValueSat: *SatB1T2A5,
|
||||||
},
|
},
|
||||||
|
@ -115,7 +116,7 @@ func GetTestUTXOBlock1(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetTestUTXOBlock2(t *testing.T, parser bchain.BlockChainParser) *bchain.Block {
|
func GetTestUTXOBlock2(parser bchain.BlockChainParser) *bchain.Block {
|
||||||
return &bchain.Block{
|
return &bchain.Block{
|
||||||
BlockHeader: bchain.BlockHeader{
|
BlockHeader: bchain.BlockHeader{
|
||||||
Height: 225494,
|
Height: 225494,
|
||||||
|
@ -142,14 +143,14 @@ func GetTestUTXOBlock2(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 0,
|
N: 0,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr6, t, parser),
|
Hex: AddressToPubKeyHex(Addr6, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB2T1A6,
|
ValueSat: *SatB2T1A6,
|
||||||
},
|
},
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 1,
|
N: 1,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr7, t, parser),
|
Hex: AddressToPubKeyHex(Addr7, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB2T1A7,
|
ValueSat: *SatB2T1A7,
|
||||||
},
|
},
|
||||||
|
@ -175,14 +176,14 @@ func GetTestUTXOBlock2(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 0,
|
N: 0,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr8, t, parser),
|
Hex: AddressToPubKeyHex(Addr8, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB2T2A8,
|
ValueSat: *SatB2T2A8,
|
||||||
},
|
},
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 1,
|
N: 1,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr9, t, parser),
|
Hex: AddressToPubKeyHex(Addr9, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB2T2A9,
|
ValueSat: *SatB2T2A9,
|
||||||
},
|
},
|
||||||
|
@ -204,7 +205,7 @@ func GetTestUTXOBlock2(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 0,
|
N: 0,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(Addr5, t, parser),
|
Hex: AddressToPubKeyHex(Addr5, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB2T3A5,
|
ValueSat: *SatB2T3A5,
|
||||||
},
|
},
|
||||||
|
@ -224,7 +225,7 @@ func GetTestUTXOBlock2(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo
|
||||||
bchain.Vout{
|
bchain.Vout{
|
||||||
N: 0,
|
N: 0,
|
||||||
ScriptPubKey: bchain.ScriptPubKey{
|
ScriptPubKey: bchain.ScriptPubKey{
|
||||||
Hex: AddressToPubKeyHex(AddrA, t, parser),
|
Hex: AddressToPubKeyHex(AddrA, parser),
|
||||||
},
|
},
|
||||||
ValueSat: *SatB2T4AA,
|
ValueSat: *SatB2T4AA,
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,159 @@
|
||||||
|
package dbtestdata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"blockbook/bchain"
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"math/big"
|
||||||
|
)
|
||||||
|
|
||||||
|
type fakeBlockChain struct {
|
||||||
|
parser bchain.BlockChainParser
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFakeBlockChain(parser bchain.BlockChainParser) (*fakeBlockChain, error) {
|
||||||
|
return &fakeBlockChain{parser: parser}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) Initialize() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) Shutdown(ctx context.Context) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) IsTestnet() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetNetworkName() string {
|
||||||
|
return "test"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetCoinName() string {
|
||||||
|
return "Testnet"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetSubversion() string {
|
||||||
|
return "/Satoshi:0.16.3/"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetChainInfo() (v *bchain.ChainInfo, err error) {
|
||||||
|
return &bchain.ChainInfo{
|
||||||
|
Chain: c.GetNetworkName(),
|
||||||
|
Blocks: 2,
|
||||||
|
Headers: 2,
|
||||||
|
Bestblockhash: GetTestUTXOBlock2(c.parser).BlockHeader.Hash,
|
||||||
|
Version: "160300",
|
||||||
|
Subversion: c.GetSubversion(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetBestBlockHash() (v string, err error) {
|
||||||
|
return GetTestUTXOBlock2(c.parser).BlockHeader.Hash, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetBestBlockHeight() (v uint32, err error) {
|
||||||
|
return GetTestUTXOBlock2(c.parser).BlockHeader.Height, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetBlockHash(height uint32) (v string, err error) {
|
||||||
|
b1 := GetTestUTXOBlock1(c.parser)
|
||||||
|
if height == b1.BlockHeader.Height {
|
||||||
|
return b1.BlockHeader.Hash, nil
|
||||||
|
}
|
||||||
|
b2 := GetTestUTXOBlock2(c.parser)
|
||||||
|
if height == b2.BlockHeader.Height {
|
||||||
|
return b2.BlockHeader.Hash, nil
|
||||||
|
}
|
||||||
|
return "", errors.New("Block not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetBlockHeader(hash string) (v *bchain.BlockHeader, err error) {
|
||||||
|
b1 := GetTestUTXOBlock1(c.parser)
|
||||||
|
if hash == b1.BlockHeader.Hash {
|
||||||
|
return &b1.BlockHeader, nil
|
||||||
|
}
|
||||||
|
b2 := GetTestUTXOBlock2(c.parser)
|
||||||
|
if hash == b2.BlockHeader.Hash {
|
||||||
|
return &b2.BlockHeader, nil
|
||||||
|
}
|
||||||
|
return nil, errors.New("Block not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetBlock(hash string, height uint32) (v *bchain.Block, err error) {
|
||||||
|
b1 := GetTestUTXOBlock1(c.parser)
|
||||||
|
if hash == b1.BlockHeader.Hash || height == b1.BlockHeader.Height {
|
||||||
|
return b1, nil
|
||||||
|
}
|
||||||
|
b2 := GetTestUTXOBlock2(c.parser)
|
||||||
|
if hash == b2.BlockHeader.Hash || height == b2.BlockHeader.Height {
|
||||||
|
return b2, nil
|
||||||
|
}
|
||||||
|
return nil, errors.New("Block not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetBlockInfo(hash string) (v *bchain.BlockInfo, err error) {
|
||||||
|
return nil, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetMempool() (v []string, err error) {
|
||||||
|
return nil, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTxInBlock(b *bchain.Block, txid string) *bchain.Tx {
|
||||||
|
for _, tx := range b.Txs {
|
||||||
|
if tx.Txid == txid {
|
||||||
|
return &tx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetTransaction(txid string) (v *bchain.Tx, err error) {
|
||||||
|
v = getTxInBlock(GetTestUTXOBlock1(c.parser), txid)
|
||||||
|
if v == nil {
|
||||||
|
v = getTxInBlock(GetTestUTXOBlock2(c.parser), txid)
|
||||||
|
}
|
||||||
|
if v != nil {
|
||||||
|
return v, nil
|
||||||
|
}
|
||||||
|
return nil, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetTransactionForMempool(txid string) (v *bchain.Tx, err error) {
|
||||||
|
return nil, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) EstimateSmartFee(blocks int, conservative bool) (v big.Int, err error) {
|
||||||
|
return v, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) EstimateFee(blocks int) (v big.Int, err error) {
|
||||||
|
return v, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) SendRawTransaction(tx string) (v string, err error) {
|
||||||
|
return "", errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) ResyncMempool(onNewTxAddr bchain.OnNewTxAddrFunc) (count int, err error) {
|
||||||
|
return 0, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetMempoolTransactions(address string) (v []string, err error) {
|
||||||
|
return nil, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetMempoolTransactionsForAddrDesc(addrDesc bchain.AddressDescriptor) (v []string, err error) {
|
||||||
|
return nil, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetMempoolEntry(txid string) (v *bchain.MempoolEntry, err error) {
|
||||||
|
return nil, errors.New("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fakeBlockChain) GetChainParser() bchain.BlockChainParser {
|
||||||
|
return c.parser
|
||||||
|
}
|
Loading…
Reference in New Issue