diff --git a/db/rocksdb_test.go b/db/rocksdb_test.go index cce3c239..1367b048 100644 --- a/db/rocksdb_test.go +++ b/db/rocksdb_test.go @@ -64,17 +64,17 @@ func closeAndDestroyRocksDB(t *testing.T, d *RocksDB) { } 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 } 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 } 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 } @@ -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 if err := checkColumn(d, cfAddresses, []keyPair{ - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "00", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "02", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "00", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "02", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "04", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "00", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "02", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "00", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "02", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "04", nil}, }); err != nil { { t.Fatal(err) @@ -201,11 +201,11 @@ func verifyAfterUTXOBlock1(t *testing.T, d *RocksDB, afterDisconnect bool) { } } 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.Addr2, t, 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.Addr4, t, 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.Addr1, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T1A1), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T1A2), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T2A3), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T2A4), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T2A5), nil}, }); err != nil { { t.Fatal(err) @@ -250,20 +250,20 @@ func verifyAfterUTXOBlock2(t *testing.T, d *RocksDB) { } } if err := checkColumn(d, cfAddresses, []keyPair{ - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "00", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "02", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "00", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, t, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "02", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, t, 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.Addr7, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "02", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr8, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "00", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr9, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "02", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "01", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, t, 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.AddrA, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T4 + "00", nil}, - keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, t, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "03", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "00", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser) + "000370d5", dbtestdata.TxidB1T1 + "02", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "00", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "02", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser) + "000370d5", dbtestdata.TxidB1T2 + "04", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr6, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "00" + dbtestdata.TxidB2T2 + "01", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr7, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "02", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr8, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "00", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr9, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "02", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "01", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser) + "000370d6", dbtestdata.TxidB2T1 + "03", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser) + "000370d6", dbtestdata.TxidB2T3 + "00" + dbtestdata.TxidB2T3 + "01", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.AddrA, d.chainParser) + "000370d6", dbtestdata.TxidB2T4 + "00", nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser) + "000370d6", dbtestdata.TxidB2T2 + "03", nil}, }); err != nil { { t.Fatal(err) @@ -335,16 +335,16 @@ func verifyAfterUTXOBlock2(t *testing.T, d *RocksDB) { } } 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.Addr2, t, 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.Addr4, t, 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.Addr6, t, 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.Addr8, t, 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.AddrA, t, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T4AA), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr1, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB1T1A1), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr2, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T1A2) + bigintToHex(dbtestdata.SatZero), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr3, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T2A3) + bigintToHex(dbtestdata.SatZero), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr4, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T2A4) + bigintToHex(dbtestdata.SatZero), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr5, d.chainParser), "02" + bigintToHex(dbtestdata.SatB1T2A5) + bigintToHex(dbtestdata.SatB2T3A5), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr6, d.chainParser), "02" + bigintToHex(dbtestdata.SatB2T1A6) + bigintToHex(dbtestdata.SatZero), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr7, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T1A7), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr8, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T2A8), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.Addr9, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T2A9), nil}, + keyPair{dbtestdata.AddressToPubKeyHex(dbtestdata.AddrA, d.chainParser), "01" + bigintToHex(dbtestdata.SatZero) + bigintToHex(dbtestdata.SatB2T4AA), nil}, }); err != nil { { t.Fatal(err) @@ -438,14 +438,14 @@ func TestRocksDB_Index_UTXO(t *testing.T) { defer closeAndDestroyRocksDB(t, d) // 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 { t.Fatal(err) } 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 - block2 := dbtestdata.GetTestUTXOBlock2(t, d.chainParser) + block2 := dbtestdata.GetTestUTXOBlock2(d.chainParser) if err := d.ConnectBlock(block2); err != nil { t.Fatal(err) } @@ -640,7 +640,7 @@ func Test_BulkConnect_UTXO(t *testing.T) { 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) } 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) } diff --git a/server/public_test.go b/server/public_test.go new file mode 100644 index 00000000..c2cc3c5c --- /dev/null +++ b/server/public_test.go @@ -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) +} diff --git a/server/socketio_test.go b/server/socketio_log_test.go similarity index 100% rename from server/socketio_test.go rename to server/socketio_log_test.go diff --git a/tests/dbtestdata/dbtestdata.go b/tests/dbtestdata/dbtestdata.go index df482b7f..2893b7be 100644 --- a/tests/dbtestdata/dbtestdata.go +++ b/tests/dbtestdata/dbtestdata.go @@ -4,19 +4,9 @@ import ( "blockbook/bchain" "encoding/hex" "math/big" - "testing" -) -func AddressToPubKeyHex(addr string, t *testing.T, parser bchain.BlockChainParser) string { - if addr == "" { - return "" - } - b, err := parser.GetAddrDescFromAddress(addr) - if err != nil { - t.Fatal(err) - } - return hex.EncodeToString(b) -} + "github.com/golang/glog" +) const ( TxidB1T1 = "00b2c06055e5e90e9c82bd4181fde310104391a7fa4f289b1704e5d90caa3840" @@ -53,7 +43,18 @@ var ( 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{ BlockHeader: bchain.BlockHeader{ Height: 225493, @@ -68,14 +69,14 @@ func GetTestUTXOBlock1(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo bchain.Vout{ N: 0, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr1, t, parser), + Hex: AddressToPubKeyHex(Addr1, parser), }, ValueSat: *SatB1T1A1, }, bchain.Vout{ N: 1, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr2, t, parser), + Hex: AddressToPubKeyHex(Addr2, parser), }, ValueSat: *SatB1T1A2, }, @@ -89,21 +90,21 @@ func GetTestUTXOBlock1(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo bchain.Vout{ N: 0, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr3, t, parser), + Hex: AddressToPubKeyHex(Addr3, parser), }, ValueSat: *SatB1T2A3, }, bchain.Vout{ N: 1, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr4, t, parser), + Hex: AddressToPubKeyHex(Addr4, parser), }, ValueSat: *SatB1T2A4, }, bchain.Vout{ N: 2, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr5, t, parser), + Hex: AddressToPubKeyHex(Addr5, parser), }, 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{ BlockHeader: bchain.BlockHeader{ Height: 225494, @@ -142,14 +143,14 @@ func GetTestUTXOBlock2(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo bchain.Vout{ N: 0, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr6, t, parser), + Hex: AddressToPubKeyHex(Addr6, parser), }, ValueSat: *SatB2T1A6, }, bchain.Vout{ N: 1, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr7, t, parser), + Hex: AddressToPubKeyHex(Addr7, parser), }, ValueSat: *SatB2T1A7, }, @@ -175,14 +176,14 @@ func GetTestUTXOBlock2(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo bchain.Vout{ N: 0, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr8, t, parser), + Hex: AddressToPubKeyHex(Addr8, parser), }, ValueSat: *SatB2T2A8, }, bchain.Vout{ N: 1, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr9, t, parser), + Hex: AddressToPubKeyHex(Addr9, parser), }, ValueSat: *SatB2T2A9, }, @@ -204,7 +205,7 @@ func GetTestUTXOBlock2(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo bchain.Vout{ N: 0, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(Addr5, t, parser), + Hex: AddressToPubKeyHex(Addr5, parser), }, ValueSat: *SatB2T3A5, }, @@ -224,7 +225,7 @@ func GetTestUTXOBlock2(t *testing.T, parser bchain.BlockChainParser) *bchain.Blo bchain.Vout{ N: 0, ScriptPubKey: bchain.ScriptPubKey{ - Hex: AddressToPubKeyHex(AddrA, t, parser), + Hex: AddressToPubKeyHex(AddrA, parser), }, ValueSat: *SatB2T4AA, }, diff --git a/tests/dbtestdata/fakechain.go b/tests/dbtestdata/fakechain.go new file mode 100644 index 00000000..350ece22 --- /dev/null +++ b/tests/dbtestdata/fakechain.go @@ -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 +}