| 53 | constexpr long SHARED_TX_OFFSET{3}; |
| 54 | |
| 55 | BOOST_AUTO_TEST_CASE(SimpleRoundTripTest) |
| 56 | { |
| 57 | CTxMemPool pool; |
| 58 | TestMemPoolEntryHelper entry; |
| 59 | CBlock block(BuildBlockTestCase()); |
| 60 | |
| 61 | LOCK2(cs_main, pool.cs); |
| 62 | pool.addUnchecked(entry.FromTx(block.vtx[2])); |
| 63 | BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2]->GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 0); |
| 64 | |
| 65 | // Do a simple ShortTxIDs RT |
| 66 | { |
| 67 | CBlockHeaderAndShortTxIDs shortIDs(block, true); |
| 68 | |
| 69 | CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); |
| 70 | stream << shortIDs; |
| 71 | |
| 72 | CBlockHeaderAndShortTxIDs shortIDs2; |
| 73 | stream >> shortIDs2; |
| 74 | |
| 75 | PartiallyDownloadedBlock partialBlock(&pool); |
| 76 | BOOST_CHECK(partialBlock.InitData(shortIDs2, extra_txn) == READ_STATUS_OK); |
| 77 | BOOST_CHECK( partialBlock.IsTxAvailable(0)); |
| 78 | BOOST_CHECK(!partialBlock.IsTxAvailable(1)); |
| 79 | BOOST_CHECK( partialBlock.IsTxAvailable(2)); |
| 80 | |
| 81 | BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2]->GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 1); |
| 82 | |
| 83 | size_t poolSize = pool.size(); |
| 84 | pool.removeRecursive(*block.vtx[2], MemPoolRemovalReason::REPLACED); |
| 85 | BOOST_CHECK_EQUAL(pool.size(), poolSize - 1); |
| 86 | |
| 87 | CBlock block2; |
| 88 | { |
| 89 | PartiallyDownloadedBlock tmp = partialBlock; |
| 90 | BOOST_CHECK(partialBlock.FillBlock(block2, {}) == READ_STATUS_INVALID); // No transactions |
| 91 | partialBlock = tmp; |
| 92 | } |
| 93 | |
| 94 | // Wrong transaction |
| 95 | { |
| 96 | PartiallyDownloadedBlock tmp = partialBlock; |
| 97 | partialBlock.FillBlock(block2, {block.vtx[2]}); // Current implementation doesn't check txn here, but don't require that |
| 98 | partialBlock = tmp; |
| 99 | } |
| 100 | bool mutated; |
| 101 | BOOST_CHECK(block.hashMerkleRoot != BlockMerkleRoot(block2, &mutated)); |
| 102 | |
| 103 | CBlock block3; |
| 104 | BOOST_CHECK(partialBlock.FillBlock(block3, {block.vtx[1]}) == READ_STATUS_OK); |
| 105 | BOOST_CHECK_EQUAL(block.GetHash().ToString(), block3.GetHash().ToString()); |
| 106 | BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), BlockMerkleRoot(block3, &mutated).ToString()); |
| 107 | BOOST_CHECK(!mutated); |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | class TestHeaderAndShortIDs { |
| 112 | // Utility to encode custom CBlockHeaderAndShortTxIDs |
nothing calls this directly
no test coverage detected