Line data Source code
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" 8 : #include "llmq/quorums_connections.h" 9 : 10 : #include <boost/test/unit_test.hpp> 11 : 12 : BOOST_AUTO_TEST_SUITE(net_quorums_tests) 13 : 14 1 : std::vector<CDeterministicMNCPtr> createMNList(unsigned int size) 15 : { 16 1 : std::vector<CDeterministicMNCPtr> mns; 17 2001 : for (size_t i = 0; i < size; i++) { 18 4000 : CDeterministicMN dmn(i); 19 2000 : uint256 newProTxHash; 20 2000 : do { 21 2000 : newProTxHash = g_insecure_rand_ctx.rand256(); 22 2000 : } while (std::find_if(mns.begin(), mns.end(), 23 2001000 : [&newProTxHash](CDeterministicMNCPtr mn){ return mn->proTxHash == newProTxHash; }) != mns.end()); 24 2000 : dmn.proTxHash = newProTxHash; 25 4000 : mns.emplace_back(std::make_shared<const CDeterministicMN>(dmn)); 26 : } 27 1 : return mns; 28 : } 29 : 30 1999 : void checkQuorumRelayMembers(const std::vector<CDeterministicMNCPtr>& list, unsigned int expectedResSize) 31 : { 32 2003000 : for (size_t i = 0; i < list.size(); i++) { 33 4002000 : const auto& set = llmq::GetQuorumRelayMembers(list, i); 34 6003000 : BOOST_CHECK_MESSAGE(set.size() == expectedResSize, 35 : strprintf("size %d, expected ret size %d, ret size %d ", list.size(), expectedResSize, set.size())); 36 6003000 : BOOST_CHECK(set.count(list[i]->proTxHash) == 0); 37 : } 38 1999 : } 39 : 40 3 : BOOST_FIXTURE_TEST_CASE(get_quorum_relay_members, BasicTestingSetup) 41 : { 42 1 : size_t list_size = 2000; // n 43 1 : size_t relay_memb = 10; // floor(log2(n-1)) 44 : 45 2 : std::vector<CDeterministicMNCPtr> masternodes = createMNList(list_size); 46 : 47 : // Test quorum sizes 2000 to 2 48 1999 : while (true) { 49 1999 : checkQuorumRelayMembers(masternodes, relay_memb); 50 : 51 1999 : masternodes.resize(--list_size); 52 1999 : 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 1998 : else if (list_size == 2 || 56 1996 : (list_size > 4 && (1 << relay_memb) >= (int)list_size)) relay_memb--; 57 : } 58 1 : } 59 : 60 : BOOST_AUTO_TEST_SUITE_END()