Fix node.fork_invalid_block_signature intermittent failures, re-enable on windows CI (#2743)
This commit is contained in:
parent
d8ec43b6c6
commit
3701340273
1 changed files with 17 additions and 11 deletions
|
|
@ -3087,32 +3087,38 @@ TEST (node, epoch_conflict_confirm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test is unstable on github actions for windows, disable if CI detected and windows
|
|
||||||
#if (defined(_WIN32) && CI)
|
|
||||||
TEST (node, DISABLED_fork_invalid_block_signature)
|
|
||||||
#else
|
|
||||||
TEST (node, fork_invalid_block_signature)
|
TEST (node, fork_invalid_block_signature)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
nano::system system (2);
|
nano::system system;
|
||||||
auto & node1 (*system.nodes[0]);
|
nano::node_flags node_flags;
|
||||||
auto & node2 (*system.nodes[1]);
|
// Disabling republishing + waiting for a rollback before sending the correct vote below fixes an intermittent failure in this test
|
||||||
|
// If these are taken out, one of two things may cause the test two fail often:
|
||||||
|
// - Block *send2* might get processed before the rollback happens, simply due to timings, with code "fork", and not be processed again. Waiting for the rollback fixes this issue.
|
||||||
|
// - Block *send1* might get processed again after the rollback happens, which causes *send2* to be processed with code "fork". Disabling block republishing ensures "send1" is not processed again.
|
||||||
|
// An alternative would be to repeatedly flood the correct vote
|
||||||
|
node_flags.disable_block_processor_republishing = true;
|
||||||
|
auto & node1 (*system.add_node (node_flags));
|
||||||
|
auto & node2 (*system.add_node (node_flags));
|
||||||
nano::keypair key2;
|
nano::keypair key2;
|
||||||
nano::genesis genesis;
|
nano::genesis genesis;
|
||||||
auto send1 (std::make_shared<nano::send_block> (genesis.hash (), key2.pub, std::numeric_limits<nano::uint128_t>::max () - node1.config.receive_minimum.number (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, *system.work.generate (genesis.hash ())));
|
auto send1 (std::make_shared<nano::send_block> (genesis.hash (), key2.pub, std::numeric_limits<nano::uint128_t>::max () - node1.config.receive_minimum.number (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, *system.work.generate (genesis.hash ())));
|
||||||
auto send2 (std::make_shared<nano::send_block> (genesis.hash (), key2.pub, std::numeric_limits<nano::uint128_t>::max () - node1.config.receive_minimum.number () * 2, nano::test_genesis_key.prv, nano::test_genesis_key.pub, *system.work.generate (genesis.hash ())));
|
auto send2 (std::make_shared<nano::send_block> (genesis.hash (), key2.pub, std::numeric_limits<nano::uint128_t>::max () - node1.config.receive_minimum.number () * 2, nano::test_genesis_key.prv, nano::test_genesis_key.pub, *system.work.generate (genesis.hash ())));
|
||||||
auto send2_corrupt (std::make_shared<nano::send_block> (*send2));
|
auto send2_corrupt (std::make_shared<nano::send_block> (*send2));
|
||||||
send2_corrupt->signature = nano::signature (123);
|
send2_corrupt->signature = nano::signature (123);
|
||||||
|
auto vote (std::make_shared<nano::vote> (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 0, send2));
|
||||||
|
auto vote_corrupt (std::make_shared<nano::vote> (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 0, send2_corrupt));
|
||||||
|
|
||||||
node1.process_active (send1);
|
node1.process_active (send1);
|
||||||
system.deadline_set (5s);
|
system.deadline_set (5s);
|
||||||
while (!node1.block (send1->hash ()))
|
while (!node1.block (send1->hash ()))
|
||||||
{
|
{
|
||||||
ASSERT_NO_ERROR (system.poll ());
|
ASSERT_NO_ERROR (system.poll ());
|
||||||
}
|
}
|
||||||
auto vote (std::make_shared<nano::vote> (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 0, send2));
|
// Send the vote with the corrupt block signature
|
||||||
auto vote_corrupt (std::make_shared<nano::vote> (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 0, send2_corrupt));
|
|
||||||
node2.network.flood_vote (vote_corrupt, 1.0f);
|
node2.network.flood_vote (vote_corrupt, 1.0f);
|
||||||
ASSERT_NO_ERROR (system.poll ());
|
// Wait for the rollback
|
||||||
|
ASSERT_TIMELY (5s, node1.stats.count (nano::stat::type::rollback, nano::stat::detail::all));
|
||||||
|
// Send the vote with the correct block
|
||||||
node2.network.flood_vote (vote, 1.0f);
|
node2.network.flood_vote (vote, 1.0f);
|
||||||
while (node1.block (send1->hash ()))
|
while (node1.block (send1->hash ()))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue