From 8dd24c29aec819d9247f57439fd6bbaa092e8e54 Mon Sep 17 00:00:00 2001 From: glozow Date: Thu, 15 May 2025 11:05:39 -0400 Subject: [PATCH] [prep/test] modify test to not access TxOrphanage internals These internals should and will be private. --- src/test/orphanage_tests.cpp | 52 +++++++++++++++--------------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/src/test/orphanage_tests.cpp b/src/test/orphanage_tests.cpp index eb1472b4866..68cffcfb422 100644 --- a/src/test/orphanage_tests.cpp +++ b/src/test/orphanage_tests.cpp @@ -26,20 +26,6 @@ class TxOrphanageTest : public node::TxOrphanage public: TxOrphanageTest(FastRandomContext& rng) : m_rng{rng} {} - inline size_t CountOrphans() const - { - return m_orphans.size(); - } - - CTransactionRef RandomOrphan() - { - std::map::iterator it; - it = m_orphans.lower_bound(Wtxid::FromUint256(m_rng.rand256())); - if (it == m_orphans.end()) - it = m_orphans.begin(); - return it->second.tx; - } - FastRandomContext& m_rng; }; @@ -114,6 +100,8 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans) auto now{GetTime()}; SetMockTime(now); + std::vector orphans_added; + // 50 orphan transactions: for (int i = 0; i < 50; i++) { @@ -126,13 +114,15 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans) tx.vout[0].nValue = i*CENT; tx.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key.GetPubKey())); - orphanage.AddTx(MakeTransactionRef(tx), i); + auto ptx = MakeTransactionRef(tx); + orphanage.AddTx(ptx, i); + orphans_added.emplace_back(ptx); } // ... and 50 that depend on other orphans: for (int i = 0; i < 50; i++) { - CTransactionRef txPrev = orphanage.RandomOrphan(); + const auto& txPrev = orphans_added[m_rng.randrange(orphans_added.size())]; CMutableTransaction tx; tx.vin.resize(1); @@ -144,13 +134,15 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans) SignatureData empty; BOOST_CHECK(SignSignature(keystore, *txPrev, tx, 0, SIGHASH_ALL, empty)); - orphanage.AddTx(MakeTransactionRef(tx), i); + auto ptx = MakeTransactionRef(tx); + orphanage.AddTx(ptx, i); + orphans_added.emplace_back(ptx); } // This really-big orphan should be ignored: for (int i = 0; i < 10; i++) { - CTransactionRef txPrev = orphanage.RandomOrphan(); + const auto& txPrev = orphans_added[m_rng.randrange(orphans_added.size())]; CMutableTransaction tx; tx.vout.resize(1); @@ -172,11 +164,11 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans) BOOST_CHECK(!orphanage.AddTx(MakeTransactionRef(tx), i)); } - size_t expected_num_orphans = orphanage.CountOrphans(); + size_t expected_num_orphans = orphanage.Size(); // Non-existent peer; nothing should be deleted orphanage.EraseForPeer(/*peer=*/-1); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), expected_num_orphans); + BOOST_CHECK_EQUAL(orphanage.Size(), expected_num_orphans); // Each of first three peers stored // two transactions each. @@ -184,40 +176,40 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans) { orphanage.EraseForPeer(i); expected_num_orphans -= 2; - BOOST_CHECK(orphanage.CountOrphans() == expected_num_orphans); + BOOST_CHECK(orphanage.Size() == expected_num_orphans); } // Test LimitOrphanTxSize() function, nothing should timeout: FastRandomContext rng{/*fDeterministic=*/true}; orphanage.LimitOrphans(/*max_orphans=*/expected_num_orphans, rng); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), expected_num_orphans); + BOOST_CHECK_EQUAL(orphanage.Size(), expected_num_orphans); expected_num_orphans -= 1; orphanage.LimitOrphans(/*max_orphans=*/expected_num_orphans, rng); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), expected_num_orphans); + BOOST_CHECK_EQUAL(orphanage.Size(), expected_num_orphans); assert(expected_num_orphans > 40); orphanage.LimitOrphans(40, rng); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 40); + BOOST_CHECK_EQUAL(orphanage.Size(), 40); orphanage.LimitOrphans(10, rng); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 10); + BOOST_CHECK_EQUAL(orphanage.Size(), 10); orphanage.LimitOrphans(0, rng); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 0); + BOOST_CHECK_EQUAL(orphanage.Size(), 0); // Add one more orphan, check timeout logic auto timeout_tx = MakeTransactionSpending(/*outpoints=*/{}, rng); orphanage.AddTx(timeout_tx, 0); orphanage.LimitOrphans(1, rng); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 1); + BOOST_CHECK_EQUAL(orphanage.Size(), 1); // One second shy of expiration SetMockTime(now + node::ORPHAN_TX_EXPIRE_TIME - 1s); orphanage.LimitOrphans(1, rng); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 1); + BOOST_CHECK_EQUAL(orphanage.Size(), 1); // Jump one more second, orphan should be timed out on limiting SetMockTime(now + node::ORPHAN_TX_EXPIRE_TIME); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 1); + BOOST_CHECK_EQUAL(orphanage.Size(), 1); orphanage.LimitOrphans(1, rng); - BOOST_CHECK_EQUAL(orphanage.CountOrphans(), 0); + BOOST_CHECK_EQUAL(orphanage.Size(), 0); } BOOST_AUTO_TEST_CASE(same_txid_diff_witness)