Changeset View
Changeset View
Standalone View
Standalone View
src/test/avalanche_tests.cpp
Show First 20 Lines • Show All 154 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(block_register) { | ||||
BOOST_CHECK_EQUAL(invs.size(), 0); | BOOST_CHECK_EQUAL(invs.size(), 0); | ||||
// Adding the block twice does nothing. | // Adding the block twice does nothing. | ||||
BOOST_CHECK(!p.addBlockToReconcile(pindex)); | BOOST_CHECK(!p.addBlockToReconcile(pindex)); | ||||
BOOST_CHECK(!p.isAccepted(pindex)); | BOOST_CHECK(!p.isAccepted(pindex)); | ||||
BOOST_CHECK(p.hasFinalized(pindex)); | BOOST_CHECK(p.hasFinalized(pindex)); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(multi_block_register) { | |||||
AvalancheProcessor p; | |||||
CBlockIndex indexA, indexB; | |||||
// Make sure the block has a hash. | |||||
CBlock blockA = CreateAndProcessBlock({}, CScript()); | |||||
const uint256 blockHashA = blockA.GetHash(); | |||||
const CBlockIndex *pindexA = mapBlockIndex[blockHashA]; | |||||
CBlock blockB = CreateAndProcessBlock({}, CScript()); | |||||
const uint256 blockHashB = blockB.GetHash(); | |||||
const CBlockIndex *pindexB = mapBlockIndex[blockHashB]; | |||||
// Querying for random block returns false. | |||||
BOOST_CHECK(!p.isAccepted(pindexA)); | |||||
BOOST_CHECK(!p.isAccepted(pindexB)); | |||||
// Start voting on block A. | |||||
BOOST_CHECK(p.addBlockToReconcile(pindexA)); | |||||
auto invs = AvalancheTest::getInvsForNextPoll(p); | |||||
BOOST_CHECK_EQUAL(invs.size(), 1); | |||||
BOOST_CHECK_EQUAL(invs[0].type, MSG_BLOCK); | |||||
BOOST_CHECK(invs[0].hash == blockHashA); | |||||
AvalancheResponse resp{ | |||||
0, {AvalancheVote(0, blockHashA), AvalancheVote(0, blockHashB)}}; | |||||
p.registerVotes(resp); | |||||
// Start voting on block B after one vote. | |||||
BOOST_CHECK(p.addBlockToReconcile(pindexB)); | |||||
invs = AvalancheTest::getInvsForNextPoll(p); | |||||
BOOST_CHECK_EQUAL(invs.size(), 2); | |||||
// Ensure B comes before A because it has accumulated more PoW. | |||||
BOOST_CHECK_EQUAL(invs[0].type, MSG_BLOCK); | |||||
BOOST_CHECK(invs[0].hash == blockHashB); | |||||
BOOST_CHECK_EQUAL(invs[1].type, MSG_BLOCK); | |||||
BOOST_CHECK(invs[1].hash == blockHashA); | |||||
// Now it is rejected, but we can vote for it numerous times. | |||||
for (int i = 0; i < AVALANCHE_FINALIZATION_SCORE + 4; i++) { | |||||
p.registerVotes(resp); | |||||
} | |||||
// Next vote will finalize block A. | |||||
p.registerVotes(resp); | |||||
// We do not vote on A anymore. | |||||
invs = AvalancheTest::getInvsForNextPoll(p); | |||||
BOOST_CHECK_EQUAL(invs.size(), 1); | |||||
BOOST_CHECK_EQUAL(invs[0].type, MSG_BLOCK); | |||||
BOOST_CHECK(invs[0].hash == blockHashB); | |||||
// Next vote will finalize block B. | |||||
p.registerVotes(resp); | |||||
// There is nothing left to vote on. | |||||
invs = AvalancheTest::getInvsForNextPoll(p); | |||||
BOOST_CHECK_EQUAL(invs.size(), 0); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(event_loop) { | BOOST_AUTO_TEST_CASE(event_loop) { | ||||
AvalancheProcessor p; | AvalancheProcessor p; | ||||
CScheduler s; | CScheduler s; | ||||
// Starting the event loop. | // Starting the event loop. | ||||
BOOST_CHECK(p.startEventLoop(s)); | BOOST_CHECK(p.startEventLoop(s)); | ||||
// There is one task planned in the next hour (our event loop). | // There is one task planned in the next hour (our event loop). | ||||
▲ Show 20 Lines • Show All 45 Lines • Show Last 20 Lines |