From d4578911c5fa116f711c0ec46588de97151e2366 Mon Sep 17 00:00:00 2001 From: gr0vity-dev Date: Tue, 3 Dec 2024 08:28:23 +0100 Subject: [PATCH] Add testcase election_scheduler.transition_optimistic_to_priority --- nano/core_test/election_scheduler.cpp | 53 +++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/nano/core_test/election_scheduler.cpp b/nano/core_test/election_scheduler.cpp index cd2d642ed6..5f6a147e9e 100644 --- a/nano/core_test/election_scheduler.cpp +++ b/nano/core_test/election_scheduler.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -157,6 +158,58 @@ TEST (election_scheduler, activate_one_flush) ASSERT_TIMELY (5s, node.active.election (send1->qualified_root ())); } +/* + * Tests that an optimistic election can be transitioned to a priority election. + * + * The test: + * 1. Creates a chain of 2 blocks with an optimistic election for the second block + * 2. Confirms the first block in the chain + * 3. Attempts to start a priority election for the second block + * 4. Verifies that the existing optimistic election is transitioned to priority + * 5. Verifies a new vote is broadcast after the transition + */ +TEST (election_scheduler, transition_optimistic_to_priority) +{ + nano::test::system system; + nano::node_config config = system.default_config (); + config.optimistic_scheduler.gap_threshold = 1; + config.enable_voting = true; + config.hinted_scheduler.enable = false; + config.network_params.network.vote_broadcast_interval = 15000ms; + auto & node = *system.add_node (config); + + // Add representative + const nano::uint128_t rep_weight = nano::Knano_ratio * 100; + nano::keypair rep = nano::test::setup_rep (system, node, rep_weight); + system.wallet (0)->insert_adhoc (rep.prv); + + // Create a chain of blocks - and trigger an optimistic election for the last block + const int howmany_blocks = 2; + auto chains = nano::test::setup_chains (system, node, /* single chain */ 1, howmany_blocks, nano::dev::genesis_key, /* do not confirm */ false); + auto & [account, blocks] = chains.front (); + + // Wait for optimistic election to start for last block + auto const & block = blocks.back (); + ASSERT_TIMELY (5s, node.vote_router.active (block->hash ())); + auto election = node.active.election (block->qualified_root ()); + ASSERT_EQ (election->behavior (), nano::election_behavior::optimistic); + + // Confirm first block to allow upgrading second block's election + nano::test::confirm (node.ledger, blocks.at (howmany_blocks - 1)); + + // Attempt to start priority election for second block + node.stats.clear (); + ASSERT_EQ (0, node.stats.count (nano::stat::type::election, nano::stat::detail::broadcast_vote)); + node.active.insert (block, nano::election_behavior::priority); + + // Verify priority transition + ASSERT_EQ (election->behavior (), nano::election_behavior::priority); + ASSERT_EQ (1, node.stats.count (nano::stat::type::active_elections, nano::stat::detail::transition_priority)); + // Verify vote broadcast after transitioning + ASSERT_TIMELY_EQ (1s, 1, node.stats.count (nano::stat::type::election, nano::stat::detail::broadcast_vote)); + ASSERT_TRUE (node.active.active (*block)); +} + /** * Tests that the election scheduler and the active transactions container (AEC) * work in sync with regards to the node configuration value "active_elections.size".