Test rocksdb tx storage functionality
This commit is contained in:
parent
850b175940
commit
d569a08cf8
@ -4,6 +4,7 @@ import (
|
|||||||
"blockbook/bchain"
|
"blockbook/bchain"
|
||||||
"blockbook/bchain/coins/btc"
|
"blockbook/bchain/coins/btc"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -122,6 +123,8 @@ func getTestUTXOBlock1(t *testing.T, d *RocksDB) *bchain.Block {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Blocktime: 22549300000,
|
||||||
|
Time: 22549300000,
|
||||||
},
|
},
|
||||||
bchain.Tx{
|
bchain.Tx{
|
||||||
Txid: "effd9ef509383d536b1c8af5bf434c8efbf521a4f2befd4022bbd68694b4ac75",
|
Txid: "effd9ef509383d536b1c8af5bf434c8efbf521a4f2befd4022bbd68694b4ac75",
|
||||||
@ -139,6 +142,8 @@ func getTestUTXOBlock1(t *testing.T, d *RocksDB) *bchain.Block {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Blocktime: 22549300001,
|
||||||
|
Time: 22549300001,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -177,6 +182,8 @@ func getTestUTXOBlock2(t *testing.T, d *RocksDB) *bchain.Block {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Blocktime: 22549400000,
|
||||||
|
Time: 22549400000,
|
||||||
},
|
},
|
||||||
bchain.Tx{
|
bchain.Tx{
|
||||||
Txid: "3d90d15ed026dc45e19ffb52875ed18fa9e8012ad123d7f7212176e2b0ebdb71",
|
Txid: "3d90d15ed026dc45e19ffb52875ed18fa9e8012ad123d7f7212176e2b0ebdb71",
|
||||||
@ -204,6 +211,8 @@ func getTestUTXOBlock2(t *testing.T, d *RocksDB) *bchain.Block {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Blocktime: 22549400001,
|
||||||
|
Time: 22549400001,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -362,6 +371,35 @@ func (p *testBitcoinParser) KeepBlockAddresses() int {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// override PackTx and UnpackTx to default BaseParser functionality
|
||||||
|
// BitcoinParser uses tx hex which is not available for the test transactions
|
||||||
|
func (p *testBitcoinParser) PackTx(tx *bchain.Tx, height uint32, blockTime int64) ([]byte, error) {
|
||||||
|
return p.BaseParser.PackTx(tx, height, blockTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *testBitcoinParser) UnpackTx(buf []byte) (*bchain.Tx, uint32, error) {
|
||||||
|
return p.BaseParser.UnpackTx(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testTxCache(t *testing.T, d *RocksDB, b *bchain.Block, tx *bchain.Tx) {
|
||||||
|
if err := d.PutTx(tx, b.Height, tx.Blocktime); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
gtx, height, err := d.GetTx(tx.Txid)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if b.Height != height {
|
||||||
|
t.Fatalf("GetTx: got height %v, expected %v", height, b.Height)
|
||||||
|
}
|
||||||
|
if fmt.Sprint(gtx) != fmt.Sprint(tx) {
|
||||||
|
t.Errorf("GetTx: %v, want %v", gtx, tx)
|
||||||
|
}
|
||||||
|
if err := d.DeleteTx(tx.Txid); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestRocksDB_Index_UTXO is a composite test probing the whole indexing functionality for UTXO chains
|
// TestRocksDB_Index_UTXO is a composite test probing the whole indexing functionality for UTXO chains
|
||||||
// It does the following:
|
// It does the following:
|
||||||
// 1) Connect two blocks (inputs from 2nd block are spending some outputs from the 1st block)
|
// 1) Connect two blocks (inputs from 2nd block are spending some outputs from the 1st block)
|
||||||
@ -370,7 +408,7 @@ func (p *testBitcoinParser) KeepBlockAddresses() int {
|
|||||||
// 4) Test tx caching functionality
|
// 4) Test tx caching functionality
|
||||||
// 5) Disconnect block 2 - expect error
|
// 5) Disconnect block 2 - expect error
|
||||||
// 6) Disconnect the block 2 using full scan
|
// 6) Disconnect the block 2 using full scan
|
||||||
// After each step, the whole content of DB is examined and any difference against expected state is regarded as failure
|
// After each step, the content of DB is examined and any difference against expected state is regarded as failure
|
||||||
func TestRocksDB_Index_UTXO(t *testing.T) {
|
func TestRocksDB_Index_UTXO(t *testing.T) {
|
||||||
d := setupRocksDB(t, &testBitcoinParser{BitcoinParser: &btc.BitcoinParser{Params: btc.GetChainParams("test")}})
|
d := setupRocksDB(t, &testBitcoinParser{BitcoinParser: &btc.BitcoinParser{Params: btc.GetChainParams("test")}})
|
||||||
defer closeAnddestroyRocksDB(t, d)
|
defer closeAnddestroyRocksDB(t, d)
|
||||||
@ -427,6 +465,22 @@ func TestRocksDB_Index_UTXO(t *testing.T) {
|
|||||||
t.Fatalf("GetBlockHash: got hash %v, expected %v", hash, "0000000076fbbed90fd75b0e18856aa35baa984e9c9d444cf746ad85e94e2997")
|
t.Fatalf("GetBlockHash: got hash %v, expected %v", hash, "0000000076fbbed90fd75b0e18856aa35baa984e9c9d444cf746ad85e94e2997")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test tx caching functionality, leave one tx in db to test cleanup in DisconnectBlock
|
||||||
|
testTxCache(t, d, block1, &block1.Txs[0])
|
||||||
|
testTxCache(t, d, block2, &block2.Txs[0])
|
||||||
|
if err = d.PutTx(&block2.Txs[1], block2.Height, block2.Txs[1].Blocktime); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// check that there is only the last tx in the cache
|
||||||
|
packedTx, err := d.chainParser.PackTx(&block2.Txs[1], block2.Height, block2.Txs[1].Blocktime)
|
||||||
|
if err := checkColumn(d, cfTransactions, []keyPair{
|
||||||
|
keyPair{block2.Txs[1].Txid, hex.EncodeToString(packedTx), nil},
|
||||||
|
}); err != nil {
|
||||||
|
{
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// DisconnectBlock for UTXO chains is not possible
|
// DisconnectBlock for UTXO chains is not possible
|
||||||
err = d.DisconnectBlock(block2)
|
err = d.DisconnectBlock(block2)
|
||||||
if err == nil || err.Error() != "DisconnectBlock is not supported for UTXO chains" {
|
if err == nil || err.Error() != "DisconnectBlock is not supported for UTXO chains" {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user