From 4fbae94bb785bc9065c090b6a42dc6b5b741a1e3 Mon Sep 17 00:00:00 2001 From: Dimitrios Siganos Date: Thu, 25 Jan 2024 19:42:20 +0700 Subject: [PATCH] Fix active_transactions.confirm_frontier (#4386) The main problem was that the bootstrap processes could sync the block before the test tried to insert it and it woudl fail because the block was already there. The main problem I fixed was to disable the bootstrap processes. I also improved it overall and made it more readable. --- nano/core_test/active_transactions.cpp | 64 ++++++++++++++++---------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/nano/core_test/active_transactions.cpp b/nano/core_test/active_transactions.cpp index 89623eab..42644411 100644 --- a/nano/core_test/active_transactions.cpp +++ b/nano/core_test/active_transactions.cpp @@ -104,25 +104,8 @@ namespace nano TEST (active_transactions, confirm_frontier) { nano::test::system system; - nano::node_flags node_flags; - node_flags.disable_request_loop = true; - // Voting node - auto & node1 = *system.add_node (node_flags); - nano::node_flags node_flags2; - // The rep crawler would otherwise request confirmations in order to find representatives - node_flags2.disable_rep_crawler = true; - auto & node2 = *system.add_node (node_flags2); - - // Add key to node1 - system.wallet (0)->insert_adhoc (nano::dev::genesis_key.prv); - // Add representative to disabled rep crawler - auto peers (node2.network.random_set (1)); - ASSERT_FALSE (peers.empty ()); - { - nano::lock_guard guard (node2.rep_crawler.probable_reps_mutex); - node2.rep_crawler.probable_reps.emplace (nano::dev::genesis_key.pub, *peers.begin ()); - } + // send 100 raw from genesis to a random account nano::state_block_builder builder; auto send = builder .account (nano::dev::genesis_key.pub) @@ -133,15 +116,46 @@ TEST (active_transactions, confirm_frontier) .sign (nano::dev::genesis_key.prv, nano::dev::genesis_key.pub) .work (*system.work.generate (nano::dev::genesis->hash ())) .build_shared (); - auto send_copy = builder.make_block ().from (*send).build_shared (); - ASSERT_EQ (nano::process_result::progress, node1.process (*send).code); - node1.confirmation_height_processor.add (send); - ASSERT_TIMELY (5s, node1.ledger.block_confirmed (node1.store.tx_begin_read (), send->hash ())); - ASSERT_EQ (nano::process_result::progress, node2.process (*send_copy).code); + + { + // Voting node + nano::node_flags node_flags; + node_flags.disable_request_loop = true; + node_flags.disable_ongoing_bootstrap = true; + node_flags.disable_ascending_bootstrap = true; + auto & node1 = *system.add_node (node_flags); + system.wallet (0)->insert_adhoc (nano::dev::genesis_key.prv); + + // we cannot use the same block instance on 2 different nodes, so make a copy + auto send_copy = builder.make_block ().from (*send).build_shared (); + ASSERT_TRUE (nano::test::process (node1, { send_copy })); + ASSERT_TRUE (nano::test::start_elections (system, node1, { send_copy })); + ASSERT_TIMELY (5s, nano::test::confirmed (node1, { send_copy })); + } + + // The rep crawler would otherwise request confirmations in order to find representatives + nano::node_flags node_flags2; + node_flags2.disable_ongoing_bootstrap = true; + node_flags2.disable_ascending_bootstrap = true; + node_flags2.disable_rep_crawler = true; + // start node2 later so that we do not get the gossip traffic + auto & node2 = *system.add_node (node_flags2); + + // Add representative to disabled rep crawler + auto peers (node2.network.random_set (1)); + ASSERT_FALSE (peers.empty ()); + { + nano::lock_guard guard (node2.rep_crawler.probable_reps_mutex); + node2.rep_crawler.probable_reps.emplace (nano::dev::genesis_key.pub, *peers.begin ()); + } + + ASSERT_EQ (nano::process_result::progress, node2.process (*send).code); ASSERT_TIMELY (5s, !node2.active.empty ()); + // Save election to check request count afterwards - auto election2 = node2.active.election (send->qualified_root ()); - ASSERT_NE (nullptr, election2); + std::shared_ptr election2; + ASSERT_TIMELY (5s, election2 = node2.active.election (send->qualified_root ())); + ASSERT_TIMELY (5s, nano::test::confirmed (node2, { send })); ASSERT_TIMELY_EQ (5s, node2.ledger.cache.cemented_count, 2); ASSERT_TIMELY (5s, node2.active.empty ()); ASSERT_GT (election2->confirmation_request_count, 0u);