Changeset View
Changeset View
Standalone View
Standalone View
src/avalanche/test/orphanproofpool_tests.cpp
Show All 13 Lines | |||||
#include <array> | #include <array> | ||||
#include <queue> | #include <queue> | ||||
using namespace avalanche; | using namespace avalanche; | ||||
BOOST_FIXTURE_TEST_SUITE(orphanproofpool_tests, TestingSetup) | BOOST_FIXTURE_TEST_SUITE(orphanproofpool_tests, TestingSetup) | ||||
/** Make a proof with stakes using random txids */ | /** Make a proof with stakes using random txids */ | ||||
static Proof makeProof(const size_t nStakes) { | static std::shared_ptr<Proof> makeProof(const size_t nStakes) { | ||||
const Amount v = 5 * COIN; | const Amount v = 5 * COIN; | ||||
const int height = 1234; | const int height = 1234; | ||||
CKey key; | CKey key; | ||||
key.MakeNewKey(true); | key.MakeNewKey(true); | ||||
ProofBuilder pb(0, 0, CPubKey()); | ProofBuilder pb(0, 0, CPubKey()); | ||||
for (size_t i = 0; i < nStakes; i++) { | for (size_t i = 0; i < nStakes; i++) { | ||||
TxId txid(GetRandHash()); | TxId txid(GetRandHash()); | ||||
pb.addUTXO(COutPoint(txid, 0), v, height, false, key); | pb.addUTXO(COutPoint(txid, 0), v, height, false, key); | ||||
} | } | ||||
return pb.build(); | return std::make_shared<Proof>(pb.build()); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(pool_starts_empty) { | BOOST_AUTO_TEST_CASE(pool_starts_empty) { | ||||
OrphanProofPool pool{10}; | OrphanProofPool pool{10}; | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 0); | BOOST_CHECK_EQUAL(pool.getNProofs(), 0); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 0); | BOOST_CHECK_EQUAL(pool.getNStakes(), 0); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(fail_to_add_same_proof_twice) { | BOOST_AUTO_TEST_CASE(fail_to_add_same_proof_twice) { | ||||
OrphanProofPool pool{10}; | OrphanProofPool pool{10}; | ||||
Proof p = makeProof(1); | auto p = makeProof(1); | ||||
BOOST_CHECK(!pool.getProof(p.getId())); | BOOST_CHECK(!pool.getProof(p->getId())); | ||||
BOOST_CHECK(pool.addProof(p)); | BOOST_CHECK(pool.addProof(p)); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 1); | BOOST_CHECK_EQUAL(pool.getNStakes(), 1); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 1); | BOOST_CHECK_EQUAL(pool.getNProofs(), 1); | ||||
BOOST_CHECK(pool.getProof(p.getId())); | BOOST_CHECK(pool.getProof(p->getId())); | ||||
BOOST_CHECK(!pool.addProof(p)); | BOOST_CHECK(!pool.addProof(p)); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 1); | BOOST_CHECK_EQUAL(pool.getNStakes(), 1); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 1); | BOOST_CHECK_EQUAL(pool.getNProofs(), 1); | ||||
BOOST_CHECK(pool.getProof(p.getId())); | BOOST_CHECK(pool.getProof(p->getId())); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(check_eviction_behavior) { | BOOST_AUTO_TEST_CASE(check_eviction_behavior) { | ||||
{ | { | ||||
// Fill the pool | // Fill the pool | ||||
OrphanProofPool pool{7}; | OrphanProofPool pool{7}; | ||||
Proof first = makeProof(4); | auto first = makeProof(4); | ||||
pool.addProof(first); | pool.addProof(first); | ||||
pool.addProof(makeProof(2)); | pool.addProof(makeProof(2)); | ||||
pool.addProof(makeProof(1)); | pool.addProof(makeProof(1)); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 7); | BOOST_CHECK_EQUAL(pool.getNStakes(), 7); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 3); | BOOST_CHECK_EQUAL(pool.getNProofs(), 3); | ||||
BOOST_CHECK(pool.getProof(first.getId())); | BOOST_CHECK(pool.getProof(first->getId())); | ||||
} | } | ||||
{ | { | ||||
OrphanProofPool pool{6}; | OrphanProofPool pool{6}; | ||||
Proof first = makeProof(4); | auto first = makeProof(4); | ||||
pool.addProof(first); | pool.addProof(first); | ||||
pool.addProof(makeProof(2)); | pool.addProof(makeProof(2)); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 6); | BOOST_CHECK_EQUAL(pool.getNStakes(), 6); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 2); | BOOST_CHECK_EQUAL(pool.getNProofs(), 2); | ||||
// The oldest proof has to be dropped | // The oldest proof has to be dropped | ||||
pool.addProof(makeProof(1)); | pool.addProof(makeProof(1)); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 3); | BOOST_CHECK_EQUAL(pool.getNStakes(), 3); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 2); | BOOST_CHECK_EQUAL(pool.getNProofs(), 2); | ||||
BOOST_CHECK(!pool.getProof(first.getId())); | BOOST_CHECK(!pool.getProof(first->getId())); | ||||
} | } | ||||
{ | { | ||||
OrphanProofPool pool{15}; | OrphanProofPool pool{15}; | ||||
Proof first = makeProof(1); | auto first = makeProof(1); | ||||
pool.addProof(first); | pool.addProof(first); | ||||
Proof second = makeProof(2); | auto second = makeProof(2); | ||||
pool.addProof(second); | pool.addProof(second); | ||||
pool.addProof(makeProof(4)); | pool.addProof(makeProof(4)); | ||||
pool.addProof(makeProof(8)); | pool.addProof(makeProof(8)); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 15); | BOOST_CHECK_EQUAL(pool.getNStakes(), 15); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 4); | BOOST_CHECK_EQUAL(pool.getNProofs(), 4); | ||||
// Multiple proofs are dropped if needed | // Multiple proofs are dropped if needed | ||||
pool.addProof(makeProof(2)); | pool.addProof(makeProof(2)); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 14); | BOOST_CHECK_EQUAL(pool.getNStakes(), 14); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 3); | BOOST_CHECK_EQUAL(pool.getNProofs(), 3); | ||||
BOOST_CHECK(!pool.getProof(first.getId())); | BOOST_CHECK(!pool.getProof(first->getId())); | ||||
BOOST_CHECK(!pool.getProof(second.getId())); | BOOST_CHECK(!pool.getProof(second->getId())); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(remove_proofs) { | BOOST_AUTO_TEST_CASE(remove_proofs) { | ||||
OrphanProofPool pool{1337}; | OrphanProofPool pool{1337}; | ||||
std::array<ProofId, 10> aProofIds; | std::array<ProofId, 10> aProofIds; | ||||
// Add 10 proofs | // Add 10 proofs | ||||
for (size_t i = 0; i < 10; i++) { | for (size_t i = 0; i < 10; i++) { | ||||
Proof p = makeProof(i + 1); | auto p = makeProof(i + 1); | ||||
aProofIds[i] = p.getId(); | aProofIds[i] = p->getId(); | ||||
BOOST_CHECK(pool.addProof(p)); | BOOST_CHECK(pool.addProof(p)); | ||||
} | } | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 10); | BOOST_CHECK_EQUAL(pool.getNProofs(), 10); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 55); | BOOST_CHECK_EQUAL(pool.getNStakes(), 55); | ||||
// Remove a proof in the middle | // Remove a proof in the middle | ||||
BOOST_CHECK(pool.removeProof(aProofIds[5])); | BOOST_CHECK(pool.removeProof(aProofIds[5])); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 9); | BOOST_CHECK_EQUAL(pool.getNProofs(), 9); | ||||
Show All 10 Lines | BOOST_AUTO_TEST_CASE(remove_proofs) { | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 38); | BOOST_CHECK_EQUAL(pool.getNStakes(), 38); | ||||
// Fail to remove a proof that is longer in the pool | // Fail to remove a proof that is longer in the pool | ||||
BOOST_CHECK(!pool.removeProof(aProofIds[5])); | BOOST_CHECK(!pool.removeProof(aProofIds[5])); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 7); | BOOST_CHECK_EQUAL(pool.getNProofs(), 7); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 38); | BOOST_CHECK_EQUAL(pool.getNStakes(), 38); | ||||
// Fail to remove a proof that was never in the pool | // Fail to remove a proof that was never in the pool | ||||
Proof p = makeProof(11); | auto p = makeProof(11); | ||||
BOOST_CHECK(!pool.getProof(p.getId())); | BOOST_CHECK(!pool.getProof(p->getId())); | ||||
BOOST_CHECK(!pool.removeProof(p.getId())); | BOOST_CHECK(!pool.removeProof(p->getId())); | ||||
BOOST_CHECK_EQUAL(pool.getNProofs(), 7); | BOOST_CHECK_EQUAL(pool.getNProofs(), 7); | ||||
BOOST_CHECK_EQUAL(pool.getNStakes(), 38); | BOOST_CHECK_EQUAL(pool.getNStakes(), 38); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(add_proof_larger_than_pool) { | BOOST_AUTO_TEST_CASE(add_proof_larger_than_pool) { | ||||
OrphanProofPool pool{AVALANCHE_MAX_PROOF_STAKES - 1}; | OrphanProofPool pool{AVALANCHE_MAX_PROOF_STAKES - 1}; | ||||
// Add a couple of small proofs | // Add a couple of small proofs | ||||
Show All 15 Lines |