Changeset View
Changeset View
Standalone View
Standalone View
src/test/avalanche_tests.cpp
Show First 20 Lines • Show All 355 Lines • ▼ Show 20 Lines | |||||
BOOST_AUTO_TEST_CASE(multi_block_register) { | BOOST_AUTO_TEST_CASE(multi_block_register) { | ||||
AvalancheProcessor p(g_connman.get()); | AvalancheProcessor p(g_connman.get()); | ||||
CBlockIndex indexA, indexB; | CBlockIndex indexA, indexB; | ||||
std::vector<AvalancheBlockUpdate> updates; | std::vector<AvalancheBlockUpdate> updates; | ||||
const Config &config = GetConfig(); | const Config &config = GetConfig(); | ||||
// Create a node that supports avalanche. | // Create several nodes that support avalanche. | ||||
auto node0 = ConnectNode(config, NODE_AVALANCHE, *peerLogic); | auto avanodes = ConnectNodes(config, p, NODE_AVALANCHE, *peerLogic); | ||||
BOOST_CHECK(p.addPeer(node0->GetId(), 0)); | |||||
auto node1 = ConnectNode(config, NODE_AVALANCHE, *peerLogic); | |||||
BOOST_CHECK(p.addPeer(node1->GetId(), 0)); | |||||
// Make sure the block has a hash. | // Make sure the block has a hash. | ||||
CBlock blockA = CreateAndProcessBlock({}, CScript()); | CBlock blockA = CreateAndProcessBlock({}, CScript()); | ||||
const uint256 blockHashA = blockA.GetHash(); | const uint256 blockHashA = blockA.GetHash(); | ||||
const CBlockIndex *pindexA = mapBlockIndex[blockHashA]; | const CBlockIndex *pindexA = mapBlockIndex[blockHashA]; | ||||
CBlock blockB = CreateAndProcessBlock({}, CScript()); | CBlock blockB = CreateAndProcessBlock({}, CScript()); | ||||
const uint256 blockHashB = blockB.GetHash(); | const uint256 blockHashB = blockB.GetHash(); | ||||
const CBlockIndex *pindexB = mapBlockIndex[blockHashB]; | const CBlockIndex *pindexB = mapBlockIndex[blockHashB]; | ||||
// Querying for random block returns false. | // Querying for random block returns false. | ||||
BOOST_CHECK(!p.isAccepted(pindexA)); | BOOST_CHECK(!p.isAccepted(pindexA)); | ||||
BOOST_CHECK(!p.isAccepted(pindexB)); | BOOST_CHECK(!p.isAccepted(pindexB)); | ||||
// Start voting on block A. | // Start voting on block A. | ||||
BOOST_CHECK(p.addBlockToReconcile(pindexA)); | BOOST_CHECK(p.addBlockToReconcile(pindexA)); | ||||
auto invs = AvalancheTest::getInvsForNextPoll(p); | auto invs = AvalancheTest::getInvsForNextPoll(p); | ||||
BOOST_CHECK_EQUAL(invs.size(), 1); | BOOST_CHECK_EQUAL(invs.size(), 1); | ||||
BOOST_CHECK_EQUAL(invs[0].type, MSG_BLOCK); | BOOST_CHECK_EQUAL(invs[0].type, MSG_BLOCK); | ||||
BOOST_CHECK(invs[0].hash == blockHashA); | BOOST_CHECK(invs[0].hash == blockHashA); | ||||
uint64_t round = AvalancheTest::getRound(p); | uint64_t round = AvalancheTest::getRound(p); | ||||
AvalancheTest::runEventLoop(p); | AvalancheTest::runEventLoop(p); | ||||
BOOST_CHECK(p.registerVotes( | BOOST_CHECK(p.registerVotes(avanodes[0]->GetId(), | ||||
node0->GetId(), {round, 0, {AvalancheVote(0, blockHashA)}}, updates)); | {round, 0, {AvalancheVote(0, blockHashA)}}, | ||||
updates)); | |||||
BOOST_CHECK_EQUAL(updates.size(), 0); | BOOST_CHECK_EQUAL(updates.size(), 0); | ||||
// Start voting on block B after one vote. | // Start voting on block B after one vote. | ||||
AvalancheResponse resp{ | AvalancheResponse resp{ | ||||
round + 1, | round + 1, | ||||
0, | 0, | ||||
{AvalancheVote(0, blockHashB), AvalancheVote(0, blockHashA)}}; | {AvalancheVote(0, blockHashB), AvalancheVote(0, blockHashA)}}; | ||||
BOOST_CHECK(p.addBlockToReconcile(pindexB)); | BOOST_CHECK(p.addBlockToReconcile(pindexB)); | ||||
Show All 17 Lines | BOOST_AUTO_TEST_CASE(multi_block_register) { | ||||
// Now it is accepted, but we can vote for it numerous times. | // Now it is accepted, but we can vote for it numerous times. | ||||
for (int i = 0; i < AVALANCHE_FINALIZATION_SCORE; i++) { | for (int i = 0; i < AVALANCHE_FINALIZATION_SCORE; i++) { | ||||
NodeId nodeid = AvalancheTest::getSuitableNodeToQuery(p); | NodeId nodeid = AvalancheTest::getSuitableNodeToQuery(p); | ||||
AvalancheTest::runEventLoop(p); | AvalancheTest::runEventLoop(p); | ||||
BOOST_CHECK(p.registerVotes(nodeid, next(resp), updates)); | BOOST_CHECK(p.registerVotes(nodeid, next(resp), updates)); | ||||
BOOST_CHECK_EQUAL(updates.size(), 0); | BOOST_CHECK_EQUAL(updates.size(), 0); | ||||
} | } | ||||
// Running two iterration of the event loop so that vote gets triggerd on A | // Running two iterration of the event loop so that vote gets triggered on A | ||||
// and B. | // and B. | ||||
NodeId firstNodeid = AvalancheTest::getSuitableNodeToQuery(p); | NodeId firstNodeid = AvalancheTest::getSuitableNodeToQuery(p); | ||||
AvalancheTest::runEventLoop(p); | AvalancheTest::runEventLoop(p); | ||||
NodeId secondNodeid = AvalancheTest::getSuitableNodeToQuery(p); | NodeId secondNodeid = AvalancheTest::getSuitableNodeToQuery(p); | ||||
AvalancheTest::runEventLoop(p); | AvalancheTest::runEventLoop(p); | ||||
BOOST_CHECK(firstNodeid != secondNodeid); | BOOST_CHECK(firstNodeid != secondNodeid); | ||||
▲ Show 20 Lines • Show All 367 Lines • Show Last 20 Lines |