Skip to content

Commit

Permalink
Add unit tests for deregistration validation
Browse files Browse the repository at this point in the history
  • Loading branch information
Doy-lee committed Aug 29, 2018
1 parent 2ef7d3b commit d06d043
Showing 1 changed file with 94 additions and 0 deletions.
94 changes: 94 additions & 0 deletions tests/unit_tests/service_nodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,3 +162,97 @@ TEST(service_nodes, staking_requirement)
ASSERT_EQ(stagenet_requirement, (15000 * COIN));
}
}

TEST(service_nodes, tx_extra_deregister_validation)
{
// Generate a quorum and the voter
const size_t num_voters = 10;
cryptonote::keypair voters[num_voters] = {};

service_nodes::quorum_state state = {};
{
state.quorum_nodes.resize(num_voters);
state.nodes_to_test.resize(num_voters);

for (size_t i = 0; i < state.quorum_nodes.size(); ++i)
{
voters[i] = cryptonote::keypair::generate(hw::get_device("default"));
state.quorum_nodes[i] = voters[i].pub;
state.nodes_to_test[i] = cryptonote::keypair::generate(hw::get_device("default")).pub;
}
}

// Valid deregister
cryptonote::tx_extra_service_node_deregister valid_deregister = {};
{
valid_deregister.block_height = 10;
valid_deregister.service_node_index = 1;
valid_deregister.votes.reserve(num_voters);
for (size_t i = 0; i < num_voters; ++i)
{
cryptonote::keypair const *voter = voters + i;
cryptonote::tx_extra_service_node_deregister::vote vote = {};

vote.voters_quorum_index = i;
vote.signature = loki::service_node_deregister::sign_vote(valid_deregister.block_height, valid_deregister.service_node_index, voter->pub, voter->sec);
valid_deregister.votes.push_back(vote);
}

cryptonote::vote_verification_context vvc = {};
bool result = loki::service_node_deregister::verify_deregister(cryptonote::MAINNET, valid_deregister, vvc, state);
if (!result)
printf("%s\n", cryptonote::print_vote_verification_context(vvc));
ASSERT_TRUE(result);
}

// Deregister has insufficient votes
{
auto deregister = valid_deregister;
while (deregister.votes.size() >= service_nodes::MIN_VOTES_TO_KICK_SERVICE_NODE)
deregister.votes.pop_back();

cryptonote::vote_verification_context vvc = {};
bool result = loki::service_node_deregister::verify_deregister(cryptonote::MAINNET, deregister, vvc, state);
ASSERT_FALSE(result);
}

// Deregister has duplicated voter
{
auto deregister = valid_deregister;
deregister.votes[0] = deregister.votes[1];

cryptonote::vote_verification_context vvc = {};
bool result = loki::service_node_deregister::verify_deregister(cryptonote::MAINNET, deregister, vvc, state);
ASSERT_FALSE(result);
}

// Deregister has one voter with invalid signature
{
auto deregister = valid_deregister;
deregister.votes[0].signature = deregister.votes[1].signature;

cryptonote::vote_verification_context vvc = {};
bool result = loki::service_node_deregister::verify_deregister(cryptonote::MAINNET, deregister, vvc, state);
ASSERT_FALSE(result);
}

// Deregister has one voter with index out of bounds
{
auto deregister = valid_deregister;
deregister.votes[0].voters_quorum_index = state.quorum_nodes.size() + 10;

cryptonote::vote_verification_context vvc = {};
bool result = loki::service_node_deregister::verify_deregister(cryptonote::MAINNET, deregister, vvc, state);
ASSERT_FALSE(result);
}

// Deregister service node index is out of bounds
{
auto deregister = valid_deregister;
deregister.service_node_index = state.nodes_to_test.size() + 10;

cryptonote::vote_verification_context vvc = {};
bool result = loki::service_node_deregister::verify_deregister(cryptonote::MAINNET, deregister, vvc, state);
ASSERT_FALSE(result);
}
}

0 comments on commit d06d043

Please sign in to comment.