LCOV - code coverage report
Current view: top level - src/test - net_quorums_tests.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 29 29 100.0 %
Date: 2025-02-23 09:33:43 Functions: 4 4 100.0 %

          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()

Generated by: LCOV version 1.14