Changeset View
Changeset View
Standalone View
Standalone View
src/test/blockencodings_tests.cpp
Show First 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
// == 2 (mempool + our copy from the GetSharedTx call) | // == 2 (mempool + our copy from the GetSharedTx call) | ||||
#define SHARED_TX_OFFSET 2 | #define SHARED_TX_OFFSET 2 | ||||
BOOST_AUTO_TEST_CASE(SimpleRoundTripTest) { | BOOST_AUTO_TEST_CASE(SimpleRoundTripTest) { | ||||
CTxMemPool pool(CFeeRate(0)); | CTxMemPool pool(CFeeRate(0)); | ||||
TestMemPoolEntryHelper entry; | TestMemPoolEntryHelper entry; | ||||
CBlock block(BuildBlockTestCase()); | CBlock block(BuildBlockTestCase()); | ||||
pool.addUnchecked(block.vtx[2]->GetId(), entry.FromTx(*block.vtx[2])); | pool.addUnchecked(block.vtx[2]->GetHash(), entry.FromTx(*block.vtx[2])); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
pool.mapTx.find(block.vtx[2]->GetId())->GetSharedTx().use_count(), | pool.mapTx.find(block.vtx[2]->GetHash())->GetSharedTx().use_count(), | ||||
SHARED_TX_OFFSET + 0); | SHARED_TX_OFFSET + 0); | ||||
// Do a simple ShortTxIDs RT | // Do a simple ShortTxIDs RT | ||||
{ | { | ||||
CBlockHeaderAndShortTxIDs shortIDs(block); | CBlockHeaderAndShortTxIDs shortIDs(block); | ||||
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); | CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); | ||||
stream << shortIDs; | stream << shortIDs; | ||||
CBlockHeaderAndShortTxIDs shortIDs2; | CBlockHeaderAndShortTxIDs shortIDs2; | ||||
stream >> shortIDs2; | stream >> shortIDs2; | ||||
PartiallyDownloadedBlock partialBlock(GetConfig(), &pool); | PartiallyDownloadedBlock partialBlock(GetConfig(), &pool); | ||||
BOOST_CHECK(partialBlock.InitData(shortIDs2, extra_txn) == | BOOST_CHECK(partialBlock.InitData(shortIDs2, extra_txn) == | ||||
READ_STATUS_OK); | READ_STATUS_OK); | ||||
BOOST_CHECK(partialBlock.IsTxAvailable(0)); | BOOST_CHECK(partialBlock.IsTxAvailable(0)); | ||||
BOOST_CHECK(!partialBlock.IsTxAvailable(1)); | BOOST_CHECK(!partialBlock.IsTxAvailable(1)); | ||||
BOOST_CHECK(partialBlock.IsTxAvailable(2)); | BOOST_CHECK(partialBlock.IsTxAvailable(2)); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
pool.mapTx.find(block.vtx[2]->GetId())->GetSharedTx().use_count(), | pool.mapTx.find(block.vtx[2]->GetHash())->GetSharedTx().use_count(), | ||||
SHARED_TX_OFFSET + 1); | SHARED_TX_OFFSET + 1); | ||||
size_t poolSize = pool.size(); | size_t poolSize = pool.size(); | ||||
pool.removeRecursive(*block.vtx[2]); | pool.removeRecursive(*block.vtx[2]); | ||||
BOOST_CHECK_EQUAL(pool.size(), poolSize - 1); | BOOST_CHECK_EQUAL(pool.size(), poolSize - 1); | ||||
CBlock block2; | CBlock block2; | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | public: | ||||
} | } | ||||
}; | }; | ||||
BOOST_AUTO_TEST_CASE(NonCoinbasePreforwardRTTest) { | BOOST_AUTO_TEST_CASE(NonCoinbasePreforwardRTTest) { | ||||
CTxMemPool pool(CFeeRate(0)); | CTxMemPool pool(CFeeRate(0)); | ||||
TestMemPoolEntryHelper entry; | TestMemPoolEntryHelper entry; | ||||
CBlock block(BuildBlockTestCase()); | CBlock block(BuildBlockTestCase()); | ||||
pool.addUnchecked(block.vtx[2]->GetId(), entry.FromTx(*block.vtx[2])); | pool.addUnchecked(block.vtx[2]->GetHash(), entry.FromTx(*block.vtx[2])); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
pool.mapTx.find(block.vtx[2]->GetId())->GetSharedTx().use_count(), | pool.mapTx.find(block.vtx[2]->GetHash())->GetSharedTx().use_count(), | ||||
SHARED_TX_OFFSET + 0); | SHARED_TX_OFFSET + 0); | ||||
uint256 txhash; | uint256 txhash; | ||||
// Test with pre-forwarding tx 1, but not coinbase | // Test with pre-forwarding tx 1, but not coinbase | ||||
{ | { | ||||
TestHeaderAndShortIDs shortIDs(block); | TestHeaderAndShortIDs shortIDs(block); | ||||
shortIDs.prefilledtxn.resize(1); | shortIDs.prefilledtxn.resize(1); | ||||
shortIDs.prefilledtxn[0] = {1, block.vtx[1]}; | shortIDs.prefilledtxn[0] = {1, block.vtx[1]}; | ||||
shortIDs.shorttxids.resize(2); | shortIDs.shorttxids.resize(2); | ||||
shortIDs.shorttxids[0] = shortIDs.GetShortID(block.vtx[0]->GetId()); | shortIDs.shorttxids[0] = shortIDs.GetShortID(block.vtx[0]->GetHash()); | ||||
shortIDs.shorttxids[1] = shortIDs.GetShortID(block.vtx[2]->GetId()); | shortIDs.shorttxids[1] = shortIDs.GetShortID(block.vtx[2]->GetHash()); | ||||
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); | CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); | ||||
stream << shortIDs; | stream << shortIDs; | ||||
CBlockHeaderAndShortTxIDs shortIDs2; | CBlockHeaderAndShortTxIDs shortIDs2; | ||||
stream >> shortIDs2; | stream >> shortIDs2; | ||||
PartiallyDownloadedBlock partialBlock(GetConfig(), &pool); | PartiallyDownloadedBlock partialBlock(GetConfig(), &pool); | ||||
BOOST_CHECK(partialBlock.InitData(shortIDs2, extra_txn) == | BOOST_CHECK(partialBlock.InitData(shortIDs2, extra_txn) == | ||||
READ_STATUS_OK); | READ_STATUS_OK); | ||||
BOOST_CHECK(!partialBlock.IsTxAvailable(0)); | BOOST_CHECK(!partialBlock.IsTxAvailable(0)); | ||||
BOOST_CHECK(partialBlock.IsTxAvailable(1)); | BOOST_CHECK(partialBlock.IsTxAvailable(1)); | ||||
BOOST_CHECK(partialBlock.IsTxAvailable(2)); | BOOST_CHECK(partialBlock.IsTxAvailable(2)); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
pool.mapTx.find(block.vtx[2]->GetId())->GetSharedTx().use_count(), | pool.mapTx.find(block.vtx[2]->GetHash())->GetSharedTx().use_count(), | ||||
SHARED_TX_OFFSET + 1); | SHARED_TX_OFFSET + 1); | ||||
CBlock block2; | CBlock block2; | ||||
{ | { | ||||
// No transactions. | // No transactions. | ||||
PartiallyDownloadedBlock tmp = partialBlock; | PartiallyDownloadedBlock tmp = partialBlock; | ||||
BOOST_CHECK(partialBlock.FillBlock(block2, {}) == | BOOST_CHECK(partialBlock.FillBlock(block2, {}) == | ||||
READ_STATUS_INVALID); | READ_STATUS_INVALID); | ||||
Show All 16 Lines | // Test with pre-forwarding tx 1, but not coinbase | ||||
BOOST_CHECK(partialBlock.FillBlock(block3, {block.vtx[0]}) == | BOOST_CHECK(partialBlock.FillBlock(block3, {block.vtx[0]}) == | ||||
READ_STATUS_OK); | READ_STATUS_OK); | ||||
BOOST_CHECK_EQUAL(block.GetHash().ToString(), | BOOST_CHECK_EQUAL(block.GetHash().ToString(), | ||||
block3.GetHash().ToString()); | block3.GetHash().ToString()); | ||||
BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), | BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), | ||||
BlockMerkleRoot(block3, &mutated).ToString()); | BlockMerkleRoot(block3, &mutated).ToString()); | ||||
BOOST_CHECK(!mutated); | BOOST_CHECK(!mutated); | ||||
txhash = block.vtx[2]->GetId(); | txhash = block.vtx[2]->GetHash(); | ||||
block.vtx.clear(); | block.vtx.clear(); | ||||
block2.vtx.clear(); | block2.vtx.clear(); | ||||
block3.vtx.clear(); | block3.vtx.clear(); | ||||
// + 1 because of partialBlockCopy. | // + 1 because of partialBlockCopy. | ||||
BOOST_CHECK_EQUAL(pool.mapTx.find(txhash)->GetSharedTx().use_count(), | BOOST_CHECK_EQUAL(pool.mapTx.find(txhash)->GetSharedTx().use_count(), | ||||
SHARED_TX_OFFSET + 1); | SHARED_TX_OFFSET + 1); | ||||
} | } | ||||
BOOST_CHECK_EQUAL(pool.mapTx.find(txhash)->GetSharedTx().use_count(), | BOOST_CHECK_EQUAL(pool.mapTx.find(txhash)->GetSharedTx().use_count(), | ||||
SHARED_TX_OFFSET + 0); | SHARED_TX_OFFSET + 0); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(SufficientPreforwardRTTest) { | BOOST_AUTO_TEST_CASE(SufficientPreforwardRTTest) { | ||||
CTxMemPool pool(CFeeRate(0)); | CTxMemPool pool(CFeeRate(0)); | ||||
TestMemPoolEntryHelper entry; | TestMemPoolEntryHelper entry; | ||||
CBlock block(BuildBlockTestCase()); | CBlock block(BuildBlockTestCase()); | ||||
pool.addUnchecked(block.vtx[1]->GetId(), entry.FromTx(*block.vtx[1])); | pool.addUnchecked(block.vtx[1]->GetHash(), entry.FromTx(*block.vtx[1])); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
pool.mapTx.find(block.vtx[1]->GetId())->GetSharedTx().use_count(), | pool.mapTx.find(block.vtx[1]->GetHash())->GetSharedTx().use_count(), | ||||
SHARED_TX_OFFSET + 0); | SHARED_TX_OFFSET + 0); | ||||
uint256 txhash; | uint256 txhash; | ||||
// Test with pre-forwarding coinbase + tx 2 with tx 1 in mempool | // Test with pre-forwarding coinbase + tx 2 with tx 1 in mempool | ||||
{ | { | ||||
TestHeaderAndShortIDs shortIDs(block); | TestHeaderAndShortIDs shortIDs(block); | ||||
shortIDs.prefilledtxn.resize(2); | shortIDs.prefilledtxn.resize(2); | ||||
shortIDs.prefilledtxn[0] = {0, block.vtx[0]}; | shortIDs.prefilledtxn[0] = {0, block.vtx[0]}; | ||||
// id == 1 as it is 1 after index 1 | // id == 1 as it is 1 after index 1 | ||||
shortIDs.prefilledtxn[1] = {1, block.vtx[2]}; | shortIDs.prefilledtxn[1] = {1, block.vtx[2]}; | ||||
shortIDs.shorttxids.resize(1); | shortIDs.shorttxids.resize(1); | ||||
shortIDs.shorttxids[0] = shortIDs.GetShortID(block.vtx[1]->GetId()); | shortIDs.shorttxids[0] = shortIDs.GetShortID(block.vtx[1]->GetHash()); | ||||
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); | CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); | ||||
stream << shortIDs; | stream << shortIDs; | ||||
CBlockHeaderAndShortTxIDs shortIDs2; | CBlockHeaderAndShortTxIDs shortIDs2; | ||||
stream >> shortIDs2; | stream >> shortIDs2; | ||||
PartiallyDownloadedBlock partialBlock(GetConfig(), &pool); | PartiallyDownloadedBlock partialBlock(GetConfig(), &pool); | ||||
BOOST_CHECK(partialBlock.InitData(shortIDs2, extra_txn) == | BOOST_CHECK(partialBlock.InitData(shortIDs2, extra_txn) == | ||||
READ_STATUS_OK); | READ_STATUS_OK); | ||||
BOOST_CHECK(partialBlock.IsTxAvailable(0)); | BOOST_CHECK(partialBlock.IsTxAvailable(0)); | ||||
BOOST_CHECK(partialBlock.IsTxAvailable(1)); | BOOST_CHECK(partialBlock.IsTxAvailable(1)); | ||||
BOOST_CHECK(partialBlock.IsTxAvailable(2)); | BOOST_CHECK(partialBlock.IsTxAvailable(2)); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
pool.mapTx.find(block.vtx[1]->GetId())->GetSharedTx().use_count(), | pool.mapTx.find(block.vtx[1]->GetHash())->GetSharedTx().use_count(), | ||||
SHARED_TX_OFFSET + 1); | SHARED_TX_OFFSET + 1); | ||||
CBlock block2; | CBlock block2; | ||||
PartiallyDownloadedBlock partialBlockCopy = partialBlock; | PartiallyDownloadedBlock partialBlockCopy = partialBlock; | ||||
BOOST_CHECK(partialBlock.FillBlock(block2, {}) == READ_STATUS_OK); | BOOST_CHECK(partialBlock.FillBlock(block2, {}) == READ_STATUS_OK); | ||||
BOOST_CHECK_EQUAL(block.GetHash().ToString(), | BOOST_CHECK_EQUAL(block.GetHash().ToString(), | ||||
block2.GetHash().ToString()); | block2.GetHash().ToString()); | ||||
bool mutated; | bool mutated; | ||||
BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), | BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), | ||||
BlockMerkleRoot(block2, &mutated).ToString()); | BlockMerkleRoot(block2, &mutated).ToString()); | ||||
BOOST_CHECK(!mutated); | BOOST_CHECK(!mutated); | ||||
txhash = block.vtx[1]->GetId(); | txhash = block.vtx[1]->GetHash(); | ||||
block.vtx.clear(); | block.vtx.clear(); | ||||
block2.vtx.clear(); | block2.vtx.clear(); | ||||
// + 1 because of partialBlockCopy. | // + 1 because of partialBlockCopy. | ||||
BOOST_CHECK_EQUAL(pool.mapTx.find(txhash)->GetSharedTx().use_count(), | BOOST_CHECK_EQUAL(pool.mapTx.find(txhash)->GetSharedTx().use_count(), | ||||
SHARED_TX_OFFSET + 1); | SHARED_TX_OFFSET + 1); | ||||
} | } | ||||
BOOST_CHECK_EQUAL(pool.mapTx.find(txhash)->GetSharedTx().use_count(), | BOOST_CHECK_EQUAL(pool.mapTx.find(txhash)->GetSharedTx().use_count(), | ||||
▲ Show 20 Lines • Show All 76 Lines • Show Last 20 Lines |