Changeset View
Changeset View
Standalone View
Standalone View
src/avalanche/test/peermanager_tests.cpp
Show First 20 Lines • Show All 1,735 Lines • ▼ Show 20 Lines | BOOST_FIXTURE_TEST_CASE(proof_radix_tree, NoCoolDownFixture) { | ||||
BOOST_CHECK(matchExpectedContent(tree)); | BOOST_CHECK(matchExpectedContent(tree)); | ||||
// Check for consistency | // Check for consistency | ||||
pm.verify(); | pm.verify(); | ||||
gArgs.ClearForcedArg("-enableavalancheproofreplacement"); | gArgs.ClearForcedArg("-enableavalancheproofreplacement"); | ||||
} | } | ||||
BOOST_FIXTURE_TEST_CASE(proof_pool_limits, NoCoolDownFixture) { | |||||
avalanche::PeerManager pm; | |||||
gArgs.ForceSetArg("-enableavalancheproofreplacement", "1"); | |||||
const CKey key = CKey::MakeCompressedKey(); | |||||
std::vector<ProofRef> proofs; | |||||
proofs.reserve(AVALANCHE_MAX_VALID_PROOFS); | |||||
// Fill valid pool | |||||
for (uint32_t i = 0; i < AVALANCHE_MAX_VALID_PROOFS; i++) { | |||||
auto proof = buildRandomProof(MIN_VALID_PROOF_SCORE + i * 2 + 1); | |||||
proofs.push_back(proof); | |||||
BOOST_CHECK(pm.registerProof(proof)); | |||||
} | |||||
// A proof will not be registered if its score is lower than all others in a | |||||
// capped out pool | |||||
{ | |||||
auto proof = buildRandomProof(MIN_VALID_PROOF_SCORE); | |||||
ProofRegistrationState state; | |||||
BOOST_CHECK(!pm.registerProof(proof, state)); | |||||
BOOST_CHECK(state.GetResult() == | |||||
ProofRegistrationResult::SCORE_TOO_LOW); | |||||
} | |||||
const Amount nextLowestStake = | |||||
int64_t(MIN_VALID_PROOF_SCORE + 2) * COIN / 100; | |||||
const COutPoint conflictingOutpoint = createUtxo(key, nextLowestStake); | |||||
auto proofSeq10 = buildProofWithOutpoints(key, {conflictingOutpoint}, | |||||
nextLowestStake, key, 10); | |||||
auto proofSeq20 = buildProofWithOutpoints(key, {conflictingOutpoint}, | |||||
nextLowestStake, key, 20); | |||||
auto proofSeq30 = buildProofWithOutpoints(key, {conflictingOutpoint}, | |||||
nextLowestStake, key, 30); | |||||
// Register a new proof, kicking out the lowest scoring proof | |||||
BOOST_CHECK(proofSeq20->getStakedAmount() > proofs[0]->getStakedAmount()); | |||||
BOOST_CHECK(pm.registerProof(proofSeq20)); | |||||
BOOST_CHECK(!pm.isBoundToPeer(proofs[0]->getId())); | |||||
// Conflicting pool still accepts proofs | |||||
BOOST_CHECK(!pm.registerProof(proofSeq10)); | |||||
BOOST_CHECK(pm.isBoundToPeer(proofSeq20->getId())); | |||||
BOOST_CHECK(pm.isInConflictingPool(proofSeq10->getId())); | |||||
// Preferred proof still replaces | |||||
BOOST_CHECK(pm.registerProof(proofSeq30)); | |||||
BOOST_CHECK(!pm.isBoundToPeer(proofSeq20->getId())); | |||||
// Kick out the valid proof and verify the conflicting proof goes with it | |||||
BOOST_CHECK(pm.isInConflictingPool(proofSeq20->getId())); | |||||
{ | |||||
auto proof = buildRandomProof(MIN_VALID_PROOF_SCORE + 3); | |||||
BOOST_CHECK(pm.registerProof(proof)); | |||||
} | |||||
BOOST_CHECK(!pm.isBoundToPeer(proofSeq20->getId())); | |||||
BOOST_CHECK(!pm.isBoundToPeer(proofSeq30->getId())); | |||||
BOOST_CHECK(!pm.isInConflictingPool(proofSeq20->getId())); | |||||
BOOST_CHECK(!pm.isInConflictingPool(proofSeq30->getId())); | |||||
gArgs.ClearForcedArg("-enableavalancheproofreplacement"); | |||||
} | |||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |