PIVX Core  5.6.99
P2P Digital Currency
net_quorums_tests.cpp
Go to the documentation of this file.
1 // Copyright (c) 2022 The PIVX Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or https://www.opensource.org/licenses/mit-license.php.
4 
5 #include "test/test_pivx.h"
6 
7 #include "evo/deterministicmns.h"
9 
10 #include <boost/test/unit_test.hpp>
11 
12 BOOST_AUTO_TEST_SUITE(net_quorums_tests)
13 
14 std::vector<CDeterministicMNCPtr> createMNList(unsigned int size)
15 {
16  std::vector<CDeterministicMNCPtr> mns;
17  for (size_t i = 0; i < size; i++) {
18  CDeterministicMN dmn(i);
19  uint256 newProTxHash;
20  do {
21  newProTxHash = g_insecure_rand_ctx.rand256();
22  } while (std::find_if(mns.begin(), mns.end(),
23  [&newProTxHash](CDeterministicMNCPtr mn){ return mn->proTxHash == newProTxHash; }) != mns.end());
24  dmn.proTxHash = newProTxHash;
25  mns.emplace_back(std::make_shared<const CDeterministicMN>(dmn));
26  }
27  return mns;
28 }
29 
30 void checkQuorumRelayMembers(const std::vector<CDeterministicMNCPtr>& list, unsigned int expectedResSize)
31 {
32  for (size_t i = 0; i < list.size(); i++) {
33  const auto& set = llmq::GetQuorumRelayMembers(list, i);
34  BOOST_CHECK_MESSAGE(set.size() == expectedResSize,
35  strprintf("size %d, expected ret size %d, ret size %d ", list.size(), expectedResSize, set.size()));
36  BOOST_CHECK(set.count(list[i]->proTxHash) == 0);
37  }
38 }
39 
40 BOOST_FIXTURE_TEST_CASE(get_quorum_relay_members, BasicTestingSetup)
41 {
42  size_t list_size = 2000; // n
43  size_t relay_memb = 10; // floor(log2(n-1))
44 
45  std::vector<CDeterministicMNCPtr> masternodes = createMNList(list_size);
46 
47  // Test quorum sizes 2000 to 2
48  while (true) {
49  checkQuorumRelayMembers(masternodes, relay_memb);
50 
51  masternodes.resize(--list_size);
52  if (list_size == 1) break;
53  // n=2 is a special case (1 relay member)
54  // Otherwise relay members are 1 + max(1, floor(log2(n-1))-1)
55  else if (list_size == 2 ||
56  (list_size > 4 && (1 << relay_memb) >= (int)list_size)) relay_memb--;
57  }
58 }
59 
uint256 rand256() noexcept
generate a random uint256.
Definition: random.cpp:621
256-bit opaque blob.
Definition: uint256.h:138
BOOST_AUTO_TEST_SUITE(cuckoocache_tests)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
std::shared_ptr< const CDeterministicMN > CDeterministicMNCPtr
std::set< uint256 > GetQuorumRelayMembers(const std::vector< CDeterministicMNCPtr > &mnList, unsigned int forMemberIndex)
Definition: uint256.h:212
void checkQuorumRelayMembers(const std::vector< CDeterministicMNCPtr > &list, unsigned int expectedResSize)
std::vector< CDeterministicMNCPtr > createMNList(unsigned int size)
BOOST_FIXTURE_TEST_CASE(get_quorum_relay_members, BasicTestingSetup)
#define BOOST_CHECK(expr)
Definition: object.cpp:17
Basic testing setup.
Definition: test_pivx.h:51
FastRandomContext g_insecure_rand_ctx
Definition: test_pivx.cpp:35
#define strprintf
Definition: tinyformat.h:1056